Wie erstelle ich ein Verzeichnis, wenn es zum Erstellen einer Datei nicht vorhanden ist?

202

Ich habe hier einen Code, der kaputt geht, wenn das Verzeichnis nicht existiert:

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

Ist es möglich, in einer Zeile (oder einigen Zeilen) zu überprüfen, ob das Verzeichnis, das zur neuen Datei führt, nicht vorhanden ist, und wenn nicht, es vor dem Erstellen der neuen Datei zu erstellen?

Ich verwende .NET 3.5.

Festplatte
quelle
1
Mögliches Duplikat von Wenn ein Ordner nicht existiert, erstellen Sie ihn
Michael Freidgeim
@ TimSchmelter, "Mögliches Duplikat" ist eine Möglichkeit zur Bereinigung - um ähnliche Fragen zu schließen und eine mit den besten Antworten zu behalten. Das Datum ist nicht wesentlich. Siehe meta.stackexchange.com/questions/147643/… Wenn Sie damit einverstanden sind, dass eine Klärung erforderlich ist, stimmen Sie bitte über meta.stackexchange.com/questions/281980/… ab
Michael Freidgeim

Antworten:

394

Erschaffen

(new FileInfo(filePath)).Directory.Create() Vor dem Schreiben in die Datei.

.... oder, wenn es existiert, dann erstellen (sonst nichts tun)

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
quelle
5
Elegante Lösung für Situationen, in denen verschachtelte Ordner erstellt werden müssen.
Denny Jacob
Danke dir! Ich habe stackoverflow.com/questions/9065598 gesehen , wollte aber mit dem absoluten Pfad zu einer Datei beginnen und wollte mich nicht mit der Aufteilung des Pfads befassen. Jetzt weiß ich, dass Sie über die FileInfo-Instanz auf das Verzeichnis zugreifen können.
Johann
Gibt es eine asynchrone Möglichkeit, dies zu tun?
Joe Phillips
1
Ich nehme an, du könntest es damit machen Task.Run(() => );.
Don
107

Sie können folgenden Code verwenden

  DirectoryInfo di = Directory.CreateDirectory(path);
RAM
quelle
41
Directory.CreateDirectorymacht genau das, was Sie wollen: Es erstellt das Verzeichnis, wenn es noch nicht existiert. Es ist nicht erforderlich, zuerst eine explizite Überprüfung durchzuführen .
Paolo Moretti
13
Löst eine IOException aus, wenn pathes sich um eine Datei und nicht um ein Verzeichnis handelt. msdn.microsoft.com/en-us/library/54a0at6s(v=vs.110).aspx
Scaryman
34

Wie @hitec sagte, müssen Sie sicherstellen, dass Sie über die richtigen Berechtigungen verfügen. Wenn Sie dies tun, können Sie diese Zeile verwenden, um die Existenz des Verzeichnisses sicherzustellen:

Directory.CreateDirectory(Path.GetDirectoryName(filePath))

willvv
quelle
0

Eine elegante Möglichkeit, Ihre Datei in ein nicht vorhandenes Verzeichnis zu verschieben, besteht darin, die folgende Erweiterung für die native FileInfo-Klasse zu erstellen:

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

Verwenden Sie dann die brandneue MoveTo-Erweiterung:

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

Überprüfen Sie die Dokumentation zur Methodenerweiterung .

MiguelSlv
quelle
-1

Mit File.Exists können Sie überprüfen, ob die Datei vorhanden ist, und sie mit File.Create erstellen bei Bedarf . Stellen Sie sicher, dass Sie überprüfen, ob Sie Zugriff haben, um Dateien an diesem Speicherort zu erstellen.

Sobald Sie sicher sind, dass die Datei vorhanden ist, können Sie sicher darauf schreiben. Als Vorsichtsmaßnahme sollten Sie Ihren Code in einen try ... catch-Block einfügen und die Ausnahmen abfangen, die die Funktion wahrscheinlich auslöst, wenn die Dinge nicht genau wie geplant verlaufen.

Zusätzliche Informationen für grundlegende Datei-E / A-Konzepte .

hitec
quelle
Ich habe Ihre Frage, die Sie in eine möglicherweise nicht vorhandene Datei schreiben wollten, zunächst falsch gelesen. Die Konzepte sind jedoch für Datei- und Verzeichnis-E / A im Wesentlichen gleich.
Hitec
-2

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

var file = new FileInfo(filePath);

file.Directory.Create(); Wenn das Verzeichnis bereits vorhanden ist, führt diese Methode nichts aus.

var sw = new StreamWriter(filePath, true);

sw.WriteLine(Enter your message here);

sw.Close();

Godwin Awojobi
quelle