it-swarm.com.de

Wie erstelle ich eine Datei UND Ordner, wenn die Ordner nicht vorhanden sind?

stellen Sie sich vor, ich möchte die folgende Datei erstellen (oder überschreiben): - C:\Temp\Bar\Foo\Test.txt

Mit der Methode File.Create (..) können Sie dies tun.

ABER, wenn ich keinen der folgenden Ordner habe (von diesem Beispielpfad, oben)

  • Temp
  • Bar
  • Foo

dann bekomme ich eine DirectoryNotFoundException geworfen.

Also .. Wenn ein Pfad angegeben ist, wie können wir rekursiv alle Ordner erstellen, die zum Erstellen der Datei für diesen Pfad erforderlich sind? Wenn temporäre oder Balkenordner vorhanden sind , aber Foo nicht ... dann wird das auch erstellt.

Nehmen wir der Einfachheit halber an, dass keine Sicherheitsbedenken bestehen - alle Berechtigungen sind in Ordnung usw.

118
Pure.Krome
DirectoryInfo di = Directory.CreateDirectory(path);
Console.WriteLine("The directory was created successfully at {0}.",
    Directory.GetCreationTime(path));

Siehe diese MSDN-Seite .

Hoffe das hilft!

106

Um zusammenzufassen, was in anderen Antworten kommentiert wurde:

//path = @"C:\Temp\Bar\Foo\Test.txt";
Directory.CreateDirectory(Path.GetDirectoryName(path));

Directory.CreateDirectory erstellt die Verzeichnisse rekursiv und wenn das Verzeichnis bereits existiert, wird es ohne Fehler zurückgegeben.

Wenn es zufällig eine Datei Foo um C:\Temp\Bar\Foo Eine Ausnahme wird ausgelöst.

115
hultqvist

Verwenden Sie Directory.CreateDirectory , bevor Sie die Datei erstellen. Es erstellt den Ordner rekursiv für Sie.

16
Grzenio

Sie müssen beide Teile des Pfads (Verzeichnis und Dateiname) überprüfen und jeden erstellen, falls er nicht vorhanden ist.

Verwenden File.Exists und Directory.Exists um herauszufinden, ob sie existieren. Directory.CreateDirectory erstellt den gesamten Pfad für Sie, sodass Sie diesen nur einmal aufrufen müssen, wenn das Verzeichnis nicht vorhanden ist. Erstellen Sie dann einfach die Datei.

3
Oded

Sie sollten Directory.CreateDirectory verwenden.

http://msdn.Microsoft.com/en-us/library/54a0at6s.aspx

2
Nick

. Wenn ein Pfad angegeben ist, wie können wir rekursiv alle Ordner erstellen, die zum Erstellen der Datei für diesen Pfad erforderlich sind?

Erstellt alle Verzeichnisse und Unterverzeichnisse gemäß Pfadangabe.

Directory.CreateDirectory(path);

dann können Sie eine Datei erstellen.

2
Arseny

Ich weiß, dass es hier einige andere Antworten gibt, aber keine davon ist nicht vollständig genug. Der folgende Code wird Verzeichnisse erstellen (falls nicht vorhanden) & dann Dateien kopieren.

// 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"));
        }
    }
}
1
Mehdi Dehghani

Angenommen, Ihre Assembly/Exe hat FileIO die Berechtigung für sich selbst, ist auch nicht richtig. Ihre Anwendung wird möglicherweise nicht mit Administratorrechten ausgeführt. Es ist wichtig, Codezugriffssicherheit und AnfordernBerechtigungen zu berücksichtigen. Beispielcode:

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

Grundlegendes zur .NET-Codezugriffssicherheit

Wird "Code Access Security" in der realen Welt verwendet?

0
PRR

Sie möchten Directory.CreateDirectory ()

Hier ist eine Klasse, die ich verwende (in C # konvertiert), die, wenn Sie ein Quellverzeichnis und ein Ziel übergeben, alle Dateien und Unterordner dieses Verzeichnisses in Ihr Ziel kopiert:

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

}

}

0
Markive