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.



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

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

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


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 .


-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 .


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.