¿Cómo creo un directorio si no existe para crear un archivo?

202

Tengo un código aquí que se rompe si el directorio no existe:

System.IO.File.WriteAllText(filePath, content);

En una línea (o algunas líneas), ¿es posible verificar si el directorio que conduce al nuevo archivo no existe y, si no, crearlo antes de crear el nuevo archivo?

Estoy usando .NET 3.5.

Disco duro
fuente
1
Posible duplicado de Si no existe una carpeta,
créela
@TimSchmelter, "Posible duplicado" es una forma de limpieza: cerrar preguntas similares y mantener una con las mejores respuestas. La fecha no es esencial. Consulte meta.stackexchange.com/questions/147643/…. Si acepta que requiere una aclaración, vote en meta.stackexchange.com/questions/281980/…
Michael Freidgeim el

Respuestas:

394

Crear

(new FileInfo(filePath)).Directory.Create() Antes de escribir en el archivo.

.... O, si existe, entonces crea (de lo contrario no hagas nada)

System.IO.FileInfo file = new System.IO.FileInfo(filePath);
file.Directory.Create(); // If the directory already exists, this method does nothing.
System.IO.File.WriteAllText(file.FullName, content);
Don
fuente
55
Solución elegante, ya que maneja situaciones que requieren la creación de carpetas anidadas.
Denny Jacob
¡Gracias! Vi stackoverflow.com/questions/9065598 , pero quería comenzar con la ruta absoluta a un archivo, y no quería tratar de dividir la ruta. Ahora sé que puede acceder al Directorio desde la instancia de FileInfo.
Johann
¿Hay alguna forma asíncrona de hacer esto?
Joe Phillips
1
Supongo que podrías hacerlo Task.Run(() => );.
Don
107

Puedes usar el siguiente código

  DirectoryInfo di = Directory.CreateDirectory(path);
RAM
fuente
41
Directory.CreateDirectoryhace exactamente lo que quieres: crea el directorio si aún no existe. No hay necesidad de hacer una verificación explícita primero .
Paolo Moretti
13
Lanza una IOException si pathes un archivo y no un directorio. msdn.microsoft.com/en-us/library/54a0at6s(v=vs.110).aspx
scaryman
34

Como dijo @hitec, debe asegurarse de tener los permisos correctos; si lo tiene, puede usar esta línea para garantizar la existencia del directorio:

Directory.CreateDirectory(Path.GetDirectoryName(filePath))

willvv
fuente
0

Una forma elegante de mover su archivo a un directorio inexistente es crear la siguiente extensión a la clase nativa FileInfo:

public static class FileInfoExtension
{
    //second parameter is need to avoid collision with native MoveTo
    public static void MoveTo(this FileInfo file, string destination, bool autoCreateDirectory) { 

        if (autoCreateDirectory)
        {
            var destinationDirectory = new DirectoryInfo(Path.GetDirectoryName(destination));

            if (!destinationDirectory.Exists)
                destinationDirectory.Create();
        }

        file.MoveTo(destination);
    }
}

Luego use la nueva extensión MoveTo:

 using <namespace of FileInfoExtension>;
 ...
 new FileInfo("some path")
     .MoveTo("target path",true);

Consulte la documentación de la extensión de métodos .

MiguelSlv
fuente
-1

Puede usar File.Exists para verificar si el archivo existe y crearlo usando File.Create si es necesario. Asegúrese de verificar si tiene acceso para crear archivos en esa ubicación.

Una vez que esté seguro de que el archivo existe, puede escribir en él de manera segura. Aunque como medida de precaución, debe probar su código ... capturar bloqueos y capturar las excepciones que la función puede generar si las cosas no salen exactamente como se planeó.

Información adicional para conceptos básicos de E / S de archivos .

hitec
fuente
Inicialmente leí mal tu pregunta de que querías escribir en un archivo que puede no existir. Sin embargo, los conceptos son esencialmente los mismos para File y Directory IO.
hitec
-2

var filePath = context.Server.MapPath(Convert.ToString(ConfigurationManager.AppSettings["ErrorLogFile"]));

var file = new FileInfo(filePath);

file.Directory.Create(); Si el directorio ya existe, este método no hace nada.

var sw = new StreamWriter(filePath, true);

sw.WriteLine(Enter your message here);

sw.Close();

Godwin Awojobi
fuente