seleccionar ruta recuperar raiz proyecto obtener net con carpeta archivo aplicacion c# filesystems .net system.io.directory

recuperar - c#- Función para replicar la estructura de la carpeta en la ruta del archivo



ruta de mi aplicacion c# (4)

Necesito una función simple que tome un FileInfo y un destination_directory_name como entrada, obtenga la ruta del archivo desde el archivo info y la replique en el destination_directory_name pasado como el segundo parámetro.

por ej. filepath es "d: / grabaciones / ubicación1 / cliente1 / trabajo1 / archivo1.ext la función debe crear los directorios en el nombre_directorio_destino si no existen y copiar el archivo después de crear los directorios.


Estoy usando el siguiente método para ese propósito:

public static void CreateDirectory(DirectoryInfo directory) { if (!directory.Parent.Exists) CreateDirectory(directory.Parent); directory.Create(); }

Úselo de esta manera:

// path is your file path string directory = Path.GetDirectoryName(path); CreateDirectory(new DirectoryInfo(directory));


System.IO.Directory.CreateDirectory se puede utilizar para crear el directorio final, también creará automáticamente todas las carpetas en la ruta si no existen.

//Will create all three directories (if they do not already exist). System.IO.Directory.CreateDirectory("C://First//Second//Third")


Según la respuesta de @ NTDLS, este es un método que replicará el origen al destino. Maneja el caso donde la fuente es un archivo o una carpeta. El nombre de la función me apesta ... déjame saber si piensas en una mejor.

/// <summary> /// Copies the source to the dest. Creating any neccessary folders in the destination path as neccessary. /// /// For example: /// Directory Example: /// pSource = C:/somedir/conf and pDest=C:/somedir/backups/USER_TIMESTAMP/somedir/conf /// all files/folders under source will be replicated to destination and any paths in between will be created. /// </summary> /// <param name="pSource">path to file or directory that you want to copy from</param> /// <param name="pDest">path to file or directory that you want to copy to</param> /// <param name="pOverwriteDest">if true, files/directories in pDest will be overwritten.</param> public static void FileCopyWithReplicate(string pSource, string pDest, bool pOverwriteDest) { string destDirectory = Path.GetDirectoryName(pDest); System.IO.Directory.CreateDirectory(destDirectory); if (Directory.Exists(pSource)) { DirectoryCopy(pSource, pDest,pOverwriteDest); } else { File.Copy(pSource, pDest, pOverwriteDest); } } // From MSDN Aricle "How to: Copy Directories" // Link: http://msdn.microsoft.com/en-us/library/bb762914.aspx private static void DirectoryCopy(string sourceDirName, string destDirName, bool copySubDirs) { DirectoryInfo dir = new DirectoryInfo(sourceDirName); DirectoryInfo[] dirs = dir.GetDirectories(); if (!dir.Exists) { throw new DirectoryNotFoundException( "Source directory does not exist or could not be found: " + sourceDirName); } if (!Directory.Exists(destDirName)) { Directory.CreateDirectory(destDirName); } FileInfo[] files = dir.GetFiles(); foreach (FileInfo file in files) { string temppath = Path.Combine(destDirName, file.Name); file.CopyTo(temppath, true); } if (copySubDirs) { foreach (DirectoryInfo subdir in dirs) { string temppath = Path.Combine(destDirName, subdir.Name); DirectoryCopy(subdir.FullName, temppath, copySubDirs); } } }


Similar a la pregunta, estoy copiando una estructura de carpetas desde un destino y duplicándola a otra. Lo siento por publicar en un hilo viejo, pero puede ser útil para alguien que termina aquí.

Supongamos que tenemos una aplicación que es independiente, y tenemos que copiar la estructura de la carpeta desde una carpeta de Entrada a una carpeta de Salida. La carpeta de entrada y la carpeta de salida se encuentran en el directorio raíz de nuestra aplicación.

Podemos hacer un DirectoryInfo para la carpeta de entrada (estructura que queremos copiar) como esta:

DirectoryInfo dirInput = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory + "//Input//");

Nuestra ubicación de carpeta de salida se puede almacenar en una cadena.

string dirOutput = AppDomain.CurrentDomain.BaseDirectory + "//Output//";

Este método recursivo debería manejar el resto para nosotros.

public static void ProcessDirectories(DirectoryInfo dirInput, string dirOutput) { string dirOutputfix = String.Empty; foreach (DirectoryInfo di in dirInput.GetDirectories()) { dirOutputfix = dirOutput + "//" + di.Name); if (!Directory.Exists(dirOutputfix)) { try { Directory.CreateDirectory(dirOutputfix); } catch(Exception e) { throw (e); } } ProcessDirectories(di, dirOutputfix); } }

Este método también se puede modificar fácilmente para manejar archivos, pero lo diseñé teniendo en cuenta solo las carpetas para mi proyecto.

Ahora simplemente llamamos al método con nuestro dirInput y dirOutput.

ProcessDirectories(dirInput, dirOutput);