saber - obtener archivos de un directorio c#
¿Cómo creo un archivo Y cualquier carpeta, si las carpetas no existen? (9)
. dado un camino, ¿cómo podemos recursivamente crear todas las carpetas necesarias para crear el archivo ... para ese camino
Crea todos los directorios y subdirectorios según lo especificado por la ruta.
Directory.CreateDirectory(path);
entonces puedes crear un archivo.
imagine que deseo crear (o sobrescribir) el siguiente archivo: - C:/Temp/Bar/Foo/Test.txt
Usando el File.Create(..) , esto puede hacerlo.
PERO, si no tengo ninguna de las siguientes carpetas (de esa ruta de ejemplo, arriba)
- Temperatura
- Bar
- Foo
luego recibo una excepción DirectoryNotFoundException .
Entonces ... dado un camino, ¿cómo podemos crear recursivamente todas las carpetas necesarias para crear el archivo ... para ese camino? Si existen carpetas Temp o Bar, pero Foo no ... entonces eso también se crea.
Para simplificar, supongamos que no hay problemas de seguridad: todos los permisos están bien, etc.
Deberá verificar ambas partes de la ruta (directorio y nombre de archivo) y crear cada una si no existe.
Use File.Exists
and Directory.Exists
para averiguar si existen. Directory.CreateDirectory
creará la ruta completa para usted, por lo que solo tendrá que llamar una vez si el directorio no existe, entonces simplemente cree el archivo.
Debería usar Directory.CreateDirectory.
Para resumir lo que se ha comentado en otras respuestas:
//path = @"C:/Temp/Bar/Foo/Test.txt";
Directory.CreateDirectory(Path.GetDirectoryName(path));
Directory.CreateDirectory
creará los directorios recursivamente y si el directorio ya existe, regresará sin error.
Si resulta que hay un archivo Foo
en C:/Temp/Bar/Foo
, se lanzará una excepción.
Quiere Directory.CreateDirectory ()
Aquí hay una clase que uso (convertida a C #) que si le pasa un directorio de origen y un destino copiará todos los archivos y subcarpetas de ese directorio a su destino:
using System.IO;
public class copyTemplateFiles
{
public static bool Copy(string Source, string destination)
{
try {
string[] Files = null;
if (destination[destination.Length - 1] != Path.DirectorySeparatorChar) {
destination += Path.DirectorySeparatorChar;
}
if (!Directory.Exists(destination)) {
Directory.CreateDirectory(destination);
}
Files = Directory.GetFileSystemEntries(Source);
foreach (string Element in Files) {
// Sub directories
if (Directory.Exists(Element)) {
copyDirectory(Element, destination + Path.GetFileName(Element));
} else {
// Files in directory
File.Copy(Element, destination + Path.GetFileName(Element), true);
}
}
} catch (Exception ex) {
return false;
}
return true;
}
private static void copyDirectory(string Source, string destination)
{
string[] Files = null;
if (destination[destination.Length - 1] != Path.DirectorySeparatorChar) {
destination += Path.DirectorySeparatorChar;
}
if (!Directory.Exists(destination)) {
Directory.CreateDirectory(destination);
}
Files = Directory.GetFileSystemEntries(Source);
foreach (string Element in Files) {
// Sub directories
if (Directory.Exists(Element)) {
copyDirectory(Element, destination + Path.GetFileName(Element));
} else {
// Files in directory
File.Copy(Element, destination + Path.GetFileName(Element), true);
}
}
}
}
Sé que hay algunas otras respuestas aquí, pero ninguna de ellas es lo suficientemente completa, el siguiente código creará directorios (si no existe) y luego copiará los archivos .
// using System.IO;
// for ex. if you want to copy files from D:/A/ to D:/B/
foreach (var f in Directory.GetFiles(@"D:/A/", "*.*", SearchOption.AllDirectories))
{
var fi = new FileInfo(f);
var di = new DirectoryInfo(fi.DirectoryName);
// you can filter files here
if (fi.Name.Contains("FILTER")
{
if (!Directory.Exists(di.FullName.Replace("A", "B"))
{
Directory.CreateDirectory(di.FullName.Replace("A", "B"));
File.Copy(fi.FullName, fi.FullName.Replace("A", "B"));
}
}
}
Suponiendo que su ensamblado / FileIO tenga el permiso FileIO sí mismo, no está bien. Es posible que su aplicación no se ejecute con derechos de administrador. Es importante considerar Code Access Security y requesting FileIO Código de muestra:
FileIOPermission f2 = new FileIOPermission(FileIOPermissionAccess.Read, "C://test_r");
f2.AddPathList(FileIOPermissionAccess.Write | FileIOPermissionAccess.Read, "C://example//out.txt");
try
{
f2.Demand();
}
catch (SecurityException s)
{
Console.WriteLine(s.Message);
}
Comprender la seguridad de acceso de código .NET
¿El "Código de acceso de seguridad" de cualquier uso del mundo real?
Use Directory.CreateDirectory antes de crear el archivo. Crea la carpeta recursivamente para usted.
// Determine whether the directory exists.
if (Directory.Exists(path))
{
Console.WriteLine("That path exists already.");
return;
}
// Try to create the directory.
DirectoryInfo di = Directory.CreateDirectory(path);
Console.WriteLine("The directory was created successfully at {0}.",
Directory.GetCreationTime(path));
Vea esta página de MSDN .
Espero que ayude!