Come posso creare una directory se non esiste per creare un file?


202

Ho un pezzo di codice qui che si rompe se la directory non esiste:

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

In una riga (o poche righe), è possibile verificare se la directory che porta al nuovo file non esiste e, in caso contrario, crearla prima di creare il nuovo file?

Sto usando .NET 3.5.



@TimSchmelter, "Possibile duplicato" è un modo per ripulire - per chiudere domande simili e mantenerne una con le risposte migliori. La data non è essenziale. Vedi meta.stackexchange.com/questions/147643/… Se accetti che sia necessario un chiarimento, vota su meta.stackexchange.com/questions/281980/…
Michael Freidgeim,

Risposte:


394

Creare

(new FileInfo(filePath)).Directory.Create() Prima di scrivere sul file.

.... Oppure, se esiste, quindi crea (altrimenti non fare nulla)

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);

5
Soluzione elegante in quanto gestisce situazioni che richiedono la creazione di cartelle nidificate.
Denny Jacob

Grazie! Ho visto stackoverflow.com/questions/9065598 , ma volevo iniziare con il percorso assoluto di un file e non volevo occuparmi di dividere il percorso. Ora so che è possibile accedere alla directory dall'istanza di FileInfo.
Johann,

C'è un modo asincrono per farlo?
Joe Phillips,

1
Suppongo che potresti farlo Task.Run(() => );.
Don


34

Come ha detto @hitec, devi essere sicuro di avere le autorizzazioni giuste, se lo fai, puoi usare questa linea per assicurarti l'esistenza della directory:

Directory.CreateDirectory(Path.GetDirectoryName(filePath))


0

Un modo elegante per spostare il file in una directory inesistente è creare la seguente estensione nella classe FileInfo nativa:

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);
    }
}

Quindi utilizzare la nuovissima estensione MoveTo:

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

Controlla la documentazione relativa all'estensione dei metodi .


-1

È possibile utilizzare File.Exists per verificare l'esistenza del file e crearlo utilizzando File.Create, se necessario. Assicurati di controllare se hai accesso per creare file in quella posizione.

Una volta che sei sicuro che il file esiste, puoi scriverlo in modo sicuro. Anche se come precauzione, dovresti mettere il tuo codice in un tentativo ... catch block e catch per le eccezioni che la funzione è suscettibile di generare se le cose non vanno esattamente come previsto.

Informazioni aggiuntive per concetti di I / O di file di base .


Inizialmente ho letto male la tua domanda che volevi scrivere su un file che potrebbe non esistere. I concetti sono essenzialmente gli stessi per IO file e directory.
Hitec,

-2

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

var file = new FileInfo(filePath);

file.Directory.Create(); Se la directory esiste già, questo metodo non fa nulla.

var sw = new StreamWriter(filePath, true);

sw.WriteLine(Enter your message here);

sw.Close();

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.