Add project files.

This commit is contained in:
Miguel 2025-02-02 21:31:06 +01:00
parent 3c06e28bf1
commit 34fb7ac2c3
13 changed files with 811 additions and 0 deletions

9
App.xaml Normal file
View File

@ -0,0 +1,9 @@
<Application x:Class="DirectoryCreator.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:DirectoryCreator"
StartupUri="MainWindow.xaml">
<Application.Resources>
</Application.Resources>
</Application>

14
App.xaml.cs Normal file
View File

@ -0,0 +1,14 @@
using System.Configuration;
using System.Data;
using System.Windows;
namespace DirectoryCreator
{
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
}
}

10
AssemblyInfo.cs Normal file
View File

@ -0,0 +1,10 @@
using System.Windows;
[assembly: ThemeInfo(
ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
//(used if a resource is not found in the page,
// or application resource dictionaries)
ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
//(used if a resource is not found in the page,
// app, or any theme specific resource dictionaries)
)]

108
ConfigEditorWindow.xaml Normal file
View File

@ -0,0 +1,108 @@
<Window x:Class="DirectoryCreator.ConfigEditorWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:viewmodels="clr-namespace:DirectoryCreator.ViewModels" mc:Ignorable="d" Title="Editor de Configuraciones"
Height="600" Width="800" WindowStartupLocation="CenterOwner">
<Window.Resources>
<Style TargetType="Button">
<Setter Property="Padding" Value="10,5" />
<Setter Property="Margin" Value="5" />
</Style>
</Window.Resources>
<Grid Margin="20">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="20" />
<RowDefinition Height="Auto" />
<RowDefinition Height="20" />
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<!-- Configuración general -->
<StackPanel Grid.Row="0">
<DockPanel>
<TextBlock Text="Nombre de Configuración:" VerticalAlignment="Center" />
<TextBox Text="{Binding ConfigDescription, UpdateSourceTrigger=PropertyChanged}" Margin="10,0,0,0"
MinWidth="200" />
</DockPanel>
<DockPanel Margin="0,10,0,0">
<TextBlock Text="Ruta Base:" VerticalAlignment="Center" />
<Button Content="..." Command="{Binding SelectBasePathCommand}" DockPanel.Dock="Right" Padding="5,0"
Margin="5,0" />
<TextBox Text="{Binding BasePath, UpdateSourceTrigger=PropertyChanged}" Margin="10,0,5,0" />
</DockPanel>
</StackPanel>
<!-- Header para la lista de estructuras -->
<TextBlock Grid.Row="2" Text="Estructuras de Carpetas:" FontWeight="Bold" />
<!-- Lista de estructuras de carpetas -->
<ScrollViewer Grid.Row="4">
<ItemsControl ItemsSource="{Binding FolderStructures}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border BorderBrush="LightGray" BorderThickness="1" Margin="0,5" Padding="10">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="10" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<!-- Ruta base de la estructura -->
<DockPanel>
<Button Content="..." Command="{Binding DataContext.SelectStructurePathCommand,
RelativeSource={RelativeSource AncestorType=Window}}"
CommandParameter="{Binding}" DockPanel.Dock="Right" />
<Button Content="X" Command="{Binding DataContext.RemoveStructureCommand,
RelativeSource={RelativeSource AncestorType=Window}}"
CommandParameter="{Binding}" DockPanel.Dock="Right" Background="LightPink" />
<TextBox Text="{Binding BasePath, UpdateSourceTrigger=PropertyChanged}"
Margin="0,0,5,0" />
</DockPanel>
<!-- Lista de subcarpetas -->
<Grid Grid.Row="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<ItemsControl ItemsSource="{Binding Subfolders}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<DockPanel Margin="0,2">
<Button Content="X" Command="{Binding DataContext.RemoveSubfolderCommand,
RelativeSource={RelativeSource AncestorType=Window}}"
CommandParameter="{Binding}" DockPanel.Dock="Right"
Background="LightPink" />
<TextBox Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}"
Margin="0,0,5,0" />
</DockPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<Button Grid.Column="1" Content="+ Subcarpeta" Command="{Binding DataContext.AddSubfolderCommand,
RelativeSource={RelativeSource AncestorType=Window}}"
CommandParameter="{Binding}" />
</Grid>
</Grid>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
<!-- Botones de acción -->
<StackPanel Grid.Row="5" Orientation="Horizontal" HorizontalAlignment="Right">
<Button Content="+ Nueva Estructura" Command="{Binding AddStructureCommand}" />
<Button Content="Guardar" Command="{Binding SaveCommand}" />
<Button Content="Cancelar" Command="{Binding CancelCommand}" />
</StackPanel>
</Grid>
</Window>

211
ConfigEditorWindow.xaml.cs Normal file
View File

@ -0,0 +1,211 @@
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using DirectoryCreator.Models;
using Microsoft.Win32;
using System.Collections.ObjectModel;
using System.IO;
using System.Text.Json;
using System.Windows;
namespace DirectoryCreator
{
/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>
public partial class ConfigEditorWindow : Window
{
public ConfigEditorWindow()
{
InitializeComponent();
}
}
}
namespace DirectoryCreator.ViewModels
{
public partial class ConfigEditorViewModel : ObservableObject
{
private readonly Window _window;
private readonly string _configPath;
private bool _isNewConfig;
[ObservableProperty]
private string configDescription;
[ObservableProperty]
private string basePath;
[ObservableProperty]
private ObservableCollection<FolderStructureViewModel> folderStructures;
public ConfigEditorViewModel(Window window, FolderConfig? existingConfig = null, string? configPath = null)
{
_window = window;
_configPath = configPath;
_isNewConfig = existingConfig == null;
FolderStructures = new ObservableCollection<FolderStructureViewModel>();
if (existingConfig != null)
{
LoadFromConfig(existingConfig);
}
else
{
ConfigDescription = "Nueva Configuración";
BasePath = "";
}
}
private void LoadFromConfig(FolderConfig config)
{
ConfigDescription = config.Description;
BasePath = config.BasePath;
foreach (var structure in config.FolderStructures)
{
var structureVm = new FolderStructureViewModel
{
BasePath = structure.BasePath,
Subfolders = new ObservableCollection<SubfolderViewModel>(
structure.Subfolders.Select(s => new SubfolderViewModel { Name = s }))
};
FolderStructures.Add(structureVm);
}
}
[RelayCommand]
private void SelectBasePath()
{
var dialog = new OpenFolderDialog
{
Title = "Seleccionar Carpeta Base"
};
if (dialog.ShowDialog() == true)
{
BasePath = dialog.FolderName;
}
}
[RelayCommand]
private void SelectStructurePath(FolderStructureViewModel structure)
{
var dialog = new OpenFolderDialog
{
Title = "Seleccionar Carpeta Base para la Estructura"
};
if (dialog.ShowDialog() == true)
{
structure.BasePath = dialog.FolderName;
}
}
[RelayCommand]
private void AddStructure()
{
FolderStructures.Add(new FolderStructureViewModel
{
BasePath = "",
Subfolders = new ObservableCollection<SubfolderViewModel>()
});
}
[RelayCommand]
private void RemoveStructure(FolderStructureViewModel structure)
{
FolderStructures.Remove(structure);
}
[RelayCommand]
private void AddSubfolder(FolderStructureViewModel structure)
{
structure.Subfolders.Add(new SubfolderViewModel { Name = "Nueva Subcarpeta" });
}
[RelayCommand]
private void RemoveSubfolder(SubfolderViewModel subfolder)
{
foreach (var structure in FolderStructures)
{
if (structure.Subfolders.Contains(subfolder))
{
structure.Subfolders.Remove(subfolder);
break;
}
}
}
[RelayCommand]
private void Save()
{
try
{
var config = new FolderConfig
{
Description = ConfigDescription,
BasePath = BasePath,
FolderStructures = FolderStructures.Select(s => new FolderStructure
{
BasePath = s.BasePath,
Subfolders = s.Subfolders.Select(sf => sf.Name).ToList()
}).ToList()
};
string filePath = _configPath;
if (_isNewConfig || string.IsNullOrEmpty(filePath))
{
var dialog = new SaveFileDialog
{
Filter = "Archivos JSON (*.json)|*.json",
InitialDirectory = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Configurations"),
FileName = "config.json"
};
if (dialog.ShowDialog() != true)
return;
filePath = dialog.FileName;
}
var jsonString = JsonSerializer.Serialize(config, new JsonSerializerOptions
{
WriteIndented = true
});
File.WriteAllText(filePath, jsonString);
MessageBox.Show("Configuración guardada exitosamente!", "Éxito", MessageBoxButton.OK, MessageBoxImage.Information);
_window.DialogResult = true;
_window.Close();
}
catch (Exception ex)
{
MessageBox.Show($"Error al guardar la configuración: {ex.Message}", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
[RelayCommand]
private void Cancel()
{
_window.DialogResult = false;
_window.Close();
}
}
public partial class FolderStructureViewModel : ObservableObject
{
[ObservableProperty]
private string basePath;
[ObservableProperty]
private ObservableCollection<SubfolderViewModel> subfolders;
}
public partial class SubfolderViewModel : ObservableObject
{
[ObservableProperty]
private string name;
}
}

21
DirectoryCreator.csproj Normal file
View File

@ -0,0 +1,21 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net8.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<UseWPF>true</UseWPF>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.4.0" />
</ItemGroup>
<ItemGroup>
<None Update="folderConfig.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>

22
DirectoryCreator.sln Normal file
View File

@ -0,0 +1,22 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.12.35707.178 d17.12
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DirectoryCreator", "DirectoryCreator.csproj", "{87235683-100B-4DF9-9FD8-C67720C9F90C}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{87235683-100B-4DF9-9FD8-C67720C9F90C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{87235683-100B-4DF9-9FD8-C67720C9F90C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{87235683-100B-4DF9-9FD8-C67720C9F90C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{87235683-100B-4DF9-9FD8-C67720C9F90C}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

21
FolderConfig.cs Normal file
View File

@ -0,0 +1,21 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DirectoryCreator.Models
{
public class FolderConfig
{
public string Description { get; set; }
public string BasePath { get; set; }
public List<FolderStructure> FolderStructures { get; set; }
}
public class FolderStructure
{
public string BasePath { get; set; }
public List<string> Subfolders { get; set; }
}
}

47
MainWindow.xaml Normal file
View File

@ -0,0 +1,47 @@
<Window x:Class="DirectoryCreator.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:viewmodels="clr-namespace:DirectoryCreator.ViewModels" mc:Ignorable="d" Title="Crear Directorios Base"
Height="300" Width="500" WindowStartupLocation="CenterScreen">
<Window.DataContext>
<viewmodels:MainWindowViewModel />
</Window.DataContext>
<Grid Margin="20">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="20" />
<RowDefinition Height="Auto" />
<RowDefinition Height="20" />
<RowDefinition Height="Auto" />
<RowDefinition Height="20" />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<StackPanel Grid.Row="0" Orientation="Horizontal">
<TextBlock Text="Configuración:" VerticalAlignment="Center" />
<ComboBox Margin="10,0" ItemsSource="{Binding AvailableConfigurations}"
SelectedItem="{Binding SelectedConfiguration}" DisplayMemberPath="Description" MinWidth="200" />
<Button Content="Editar Configuraciones" Command="{Binding EditConfigurationsCommand}" Padding="10,5" />
</StackPanel>
<TextBlock Grid.Row="2" Text="Last Project:" />
<TextBlock Grid.Row="2" Margin="100,0,0,0" Text="{Binding LastProjectNumber}" />
<TextBlock Grid.Row="4" Text="Base Path:" />
<TextBlock Grid.Row="4" Margin="100,0,0,0" Text="{Binding BasePath}" />
<TextBlock Grid.Row="6" Text="New Project Name:" />
<TextBox Grid.Row="6" Margin="100,0,0,0" Text="{Binding NewProjectName, UpdateSourceTrigger=PropertyChanged}" />
<StackPanel Grid.Row="8" Orientation="Horizontal" HorizontalAlignment="Right">
<Button Content="Abrir Carpeta Base" Command="{Binding OpenBaseFolderCommand}" Padding="20,10"
Margin="0,0,10,0" />
<Button Content="Crear Directorios" Command="{Binding CreateDirectoriesCommand}" Padding="20,10" />
</StackPanel>
</Grid>
</Window>

262
MainWindow.xaml.cs Normal file
View File

@ -0,0 +1,262 @@
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using DirectoryCreator.Models;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.IO;
using System.Text.Json;
using System.Windows;
namespace DirectoryCreator.ViewModels
{
public partial class MainWindowViewModel : ObservableObject
{
private readonly string configDirectory = "Configurations";
private FolderConfig currentConfig;
[ObservableProperty]
private string lastProjectNumber;
[ObservableProperty]
private string newProjectName;
[ObservableProperty]
private string basePath;
[ObservableProperty]
private ObservableCollection<FolderConfig> availableConfigurations;
[ObservableProperty]
private FolderConfig selectedConfiguration;
public MainWindowViewModel()
{
AvailableConfigurations = new ObservableCollection<FolderConfig>();
LoadConfigurations();
}
private void LoadConfigurations()
{
try
{
// Asegurar que existe el directorio de configuraciones
if (!Directory.Exists(configDirectory))
{
Directory.CreateDirectory(configDirectory);
// Si no existe, mover el archivo de configuración por defecto
if (File.Exists("folderConfig.json"))
{
File.Move("folderConfig.json", Path.Combine(configDirectory, "default.json"));
}
}
// Cargar todas las configuraciones
var jsonFiles = Directory.GetFiles(configDirectory, "*.json");
if (jsonFiles.Length == 0)
{
MessageBox.Show("No se encontraron archivos de configuración.", "Advertencia", MessageBoxButton.OK, MessageBoxImage.Warning);
return;
}
var options = new JsonSerializerOptions
{
PropertyNameCaseInsensitive = true,
AllowTrailingCommas = true
};
AvailableConfigurations.Clear();
foreach (var jsonFile in jsonFiles)
{
var jsonString = File.ReadAllText(jsonFile);
var config = JsonSerializer.Deserialize<FolderConfig>(jsonString, options);
if (config != null)
{
// Si no tiene descripción, usar el nombre del archivo
if (string.IsNullOrEmpty(config.Description))
{
config.Description = Path.GetFileNameWithoutExtension(jsonFile);
}
AvailableConfigurations.Add(config);
}
}
// Seleccionar la primera configuración por defecto
if (AvailableConfigurations.Count > 0)
{
SelectedConfiguration = AvailableConfigurations[0];
}
}
catch (Exception ex)
{
MessageBox.Show($"Error al cargar las configuraciones: {ex.Message}", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
partial void OnSelectedConfigurationChanged(FolderConfig value)
{
if (value != null)
{
currentConfig = value;
BasePath = value.BasePath;
LoadLastProjectNumber();
}
}
[RelayCommand]
private void OpenBaseFolder()
{
try
{
if (Directory.Exists(BasePath))
{
Process.Start("explorer.exe", BasePath);
}
else
{
MessageBox.Show($"La carpeta base no existe: {BasePath}", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
catch (Exception ex)
{
MessageBox.Show($"Error al abrir la carpeta base: {ex.Message}", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
private void LoadLastProjectNumber()
{
try
{
if (string.IsNullOrEmpty(BasePath) || !Directory.Exists(BasePath))
{
NewProjectName = "001 - ";
return;
}
var directories = Directory.GetDirectories(BasePath)
.Select(d => new DirectoryInfo(d).Name)
.ToList();
var regex = new System.Text.RegularExpressions.Regex(@"^(\d{1,3})\s-\s");
var projectNumbers = new HashSet<int>();
foreach (var dirName in directories)
{
var match = regex.Match(dirName);
if (match.Success && int.TryParse(match.Groups[1].Value, out int number))
{
projectNumbers.Add(number);
}
}
var sortedNumbers = projectNumbers.OrderByDescending(n => n).ToList();
int lastValidNumber = -1;
string lastProject = "";
foreach (int number in sortedNumbers)
{
if (projectNumbers.Contains(number - 1) && projectNumbers.Contains(number - 2))
{
lastValidNumber = number;
lastProject = directories.First(d => regex.Match(d).Success &&
int.Parse(regex.Match(d).Groups[1].Value) == number);
break;
}
}
LastProjectNumber = lastProject;
NewProjectName = lastValidNumber >= 0 ? $"{(lastValidNumber + 1):000} - " : "001 - ";
if (lastValidNumber < 0)
{
MessageBox.Show("No se encontró una secuencia válida de al menos 3 números consecutivos.\nSe iniciará desde 001.",
"Información", MessageBoxButton.OK, MessageBoxImage.Information);
}
}
catch (Exception ex)
{
MessageBox.Show($"Error al cargar el último proyecto: {ex.Message}", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
NewProjectName = "001 - ";
}
}
[RelayCommand]
private void EditConfigurations()
{
var window = new ConfigEditorWindow
{
Owner = System.Windows.Application.Current.MainWindow
};
if (SelectedConfiguration != null)
{
var configPath = Directory.GetFiles(configDirectory, "*.json")
.FirstOrDefault(f =>
{
var config = JsonSerializer.Deserialize<FolderConfig>(
File.ReadAllText(f),
new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
return config?.Description == SelectedConfiguration.Description;
});
window.DataContext = new ConfigEditorViewModel(window, SelectedConfiguration, configPath);
}
else
{
window.DataContext = new ConfigEditorViewModel(window);
}
if (window.ShowDialog() == true)
{
LoadConfigurations();
}
}
[RelayCommand]
private void CreateDirectories()
{
if (string.IsNullOrEmpty(NewProjectName))
{
MessageBox.Show("Por favor ingrese un nombre de proyecto!", "Advertencia", MessageBoxButton.OK, MessageBoxImage.Warning);
return;
}
if (currentConfig == null)
{
MessageBox.Show("Por favor seleccione una configuración!", "Advertencia", MessageBoxButton.OK, MessageBoxImage.Warning);
return;
}
try
{
foreach (var structure in currentConfig.FolderStructures)
{
var basePath = structure.BasePath.Replace("{year}", DateTime.Now.Year.ToString());
var projectPath = Path.Combine(basePath, NewProjectName);
if (Directory.Exists(projectPath))
{
MessageBox.Show($"El directorio ya existe: {projectPath}", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
return;
}
Directory.CreateDirectory(projectPath);
foreach (var subfolder in structure.Subfolders)
{
var subfolderPath = Path.Combine(projectPath, subfolder);
Directory.CreateDirectory(subfolderPath);
}
}
Process.Start("explorer.exe", Path.Combine(BasePath, NewProjectName));
MessageBox.Show("Directorios creados exitosamente!", "Éxito", MessageBoxButton.OK, MessageBoxImage.Information);
LoadLastProjectNumber();
}
catch (Exception ex)
{
MessageBox.Show($"Error al crear directorios: {ex.Message}", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
}
}

12
Window1.xaml Normal file
View File

@ -0,0 +1,12 @@
<Window x:Class="DirectoryCreator.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:DirectoryCreator"
mc:Ignorable="d"
Title="Window1" Height="450" Width="800">
<Grid>
</Grid>
</Window>

27
Window1.xaml.cs Normal file
View File

@ -0,0 +1,27 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
namespace DirectoryCreator
{
/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
}
}

47
folderConfig.json Normal file
View File

@ -0,0 +1,47 @@
{
"description": "Configuración VM",
"basePath": "C:\\Trabajo\\VM",
"folderStructures": [
{
"basePath": "C:\\Trabajo\\VM",
"subfolders": [
"Documentos y Facturacion",
"InLavoro",
"InLavoro\\Backups",
"InLavoro\\PLC",
"InLavoro\\Manual",
"InLavoro\\Test",
"Entregar",
"Entregado por VM",
"Reporte",
"Simulation"
]
},
{
"basePath": "C:\\Users\\migue\\OneDrive\\Miguel\\CSA - Trabajo\\{year}\\Facturacion\\Teknors",
"subfolders": []
},
{
"basePath": "C:\\Users\\migue\\OneDrive\\Miguel\\CSA - Trabajo\\{year}\\Software-Share",
"subfolders": []
},
{
"basePath": "C:\\Users\\migue\\OneDrive\\Miguel\\CSA - Trabajo\\{year}\\Videos",
"subfolders": []
},
{
"basePath": "C:\\Users\\migue\\OneDrive\\VM REVISAR",
"subfolders": []
},
{
"basePath": "C:\\Users\\migue\\OneDrive\\Miguel\\Obsidean\\Trabajo\\VM",
"subfolders": [
"Reporte"
]
},
{
"basePath": "C:\\Users\\migue\\OneDrive\\Miguel\\CSA - Trabajo\\Software\\VM",
"subfolders": []
}
]
}