Wenn ein Ordner nicht vorhanden ist, erstellen Sie ihn


720

Ich verwende ein FileUploader-Steuerelement in meiner Anwendung. Ich möchte eine Datei in einem bestimmten Ordner speichern. Wenn dieser Ordner nicht vorhanden ist, möchte ich ihn zuerst erstellen und dann meine Datei in diesem Ordner speichern. Wenn der Ordner bereits vorhanden ist, speichern Sie einfach die Datei darin.

Wie kann ich das machen?


@JoeBlow - Ha - hätte angeben sollen, welche Antwort falsch ist - jetzt ist die Seite noch verwirrender. (Hat er die akzeptierte Antwort geändert? Oder nicht? OMG!) ;-)
Bartosz

Ich bin hier gelandet, als ich nach anderen Dingen gesucht habe, aber es ist erstaunlich, wie viele Menschen darum kämpfen, sich mit ihrer eigenen Version derselben Geschichte zu widersprechen. Microsoft hat das .NET Framework und das MSDN erstellt. Ob das korrekte Verhalten von anderen Implementierern wie Mono respektiert wird, ist für die Richtigkeit des in MSDN beschriebenen Verhaltens unerheblich. Oh, und Mono macht auch das Richtige. Wo ist also das Argument?
monkey0506

Antworten:


1239

Wie andere gesagt haben, verwenden System.IO.Directory.CreateDirectory

Sie müssen jedoch nicht zuerst prüfen, ob es vorhanden ist. Aus den Dokumenten

Alle im Pfad angegebenen Verzeichnisse werden erstellt, es sei denn, sie sind bereits vorhanden oder ein Teil des Pfads ist ungültig. Wenn das Verzeichnis bereits vorhanden ist, erstellt diese Methode kein neues Verzeichnis, sondern gibt ein DirectoryInfo-Objekt für das vorhandene Verzeichnis zurück.



25
und doch widerspricht sich das Microsoft-Codebeispiel, indem es prüft, ob das Verzeichnis zuerst existiert ...
ecoe

1
Also müssen wir prüfen, ob es existiert oder nicht? Wenn wir überprüfen und dann auch die CreateDirectory-Methode erneut überprüfen, führen wir die Überprüfung zweimal durch ... und der Betrieb des
AFAIK-

3
@Muflix wie folgt - erstelle eine Datei zum Beispiel "FILENAME" in einem Verzeichnis, aber gib ihr keine Erweiterung. Wenn Sie dann versuchen, Directory.Exists ("FILENAME") aufzurufen, wird false zurückgegeben, wie es sollte, da es kein solches Verzeichnis gibt. Wenn Sie jetzt CreateDirectory ("FILENAME") aufrufen, schlägt dies kläglich fehl, da es dort bereits "etwas" mit diesem Namen gibt. Hoffe das macht Sinn.
Otávio Décio

1
FALSCH! I Sie MÜSSEN prüfen, ob der Ordner vorhanden ist. Ich habe gerade festgestellt, dass diese Methode ein ernstes Problem hat. Wenn Sie nicht prüfen, ob der Ordner vorhanden ist, leckt das Ordner-Handle, sofern Sie es nicht ausdrücklich freigeben. Wir haben dieses Beispiel in einer Anwendung verwendet, die Millionen von Ordnern verarbeitet. Bei jedem Aufruf dieser Methode behielt die Anwendung das Dateihandle im Verzeichnis bei. Nach einigen Stunden hatte das Corporate Network NAS Millionen von Dateihandles in den Ordnern geöffnet. Aktualisierung, um den Scheck frei ist der Griff
soddoff Baldrick

356

Verwenden Sie den folgenden Code gemäß http://forums.asp.net/p/1226236/2209871.aspx :

string subPath ="ImagesPath"; // your code goes here

bool exists = System.IO.Directory.Exists(Server.MapPath(subPath));

if(!exists)
    System.IO.Directory.CreateDirectory(Server.MapPath(subPath));

41
Warum nicht: if (! Directory.Exists (path_to_check)) Directory.CreateDirectory (path_to_check);
Dayan

158
Sie müssen nicht überprüfen, ob ein Ordner vorhanden ist. Lesen Sie das Handbuch sorgfältig durch.
bazzilic

30
Überprüfen und Erstellen ist nicht atomar. Der obige Code riecht, es gibt eine Rennbedingung. Sie sollten das Verzeichnis besser nur bedingungslos erstellen und eine FileExistsAusnahme (oder was auch immer das C # -Äquivalent ist) abfangen, falls die Funktion eine auslösen soll.
Jo So

6
Wie andere bereits betont haben, besteht keine Notwendigkeit für den Aufruf von Existsund es entsteht tatsächlich eine neue Fehlerbedingung.
Ed S.

3
@ MartinSmith: Dann erstelle einfach das Verzeichnis. Überprüfen Sie nicht vorher auf Existenz. Das ist nicht nur kürzer. Es gibt auch keinen falschen Eindruck von der API System.IO.Directory.CreateDirectory. (Und es ist schneller, aber wahrscheinlich spielt das keine Rolle)
Jo So

224

Schreiben Sie einfach diese Zeile:

System.IO.Directory.CreateDirectory("my folder");
  • Wenn der Ordner noch nicht vorhanden ist , wird er erstellt .
  • Wenn der Ordner bereits vorhanden ist , wird die Zeile ignoriert .

Referenz: Artikel über Directory.CreateDirectory bei MSDN

Natürlich können Sie auch using System.IO;oben in die Quelldatei schreiben und dann Directory.CreateDirectory("my folder");jedes Mal schreiben, wenn Sie einen Ordner erstellen möchten.


28

Directory.CreateDirectory Erklärt, wie Sie versuchen, den FilePath zu erstellen, falls er nicht vorhanden ist

Directory.ExistsErklärt, wie überprüft wird, ob ein FilePath vorhanden ist. Sie benötigen dies jedoch nicht, da CreateDirectory nach Ihnen sucht.


@Tavousi diese Funktionen von Jeroenh wäre ein guter Anfang;)
Allan Chua

Keiner der MSDN-Dokumentationslinks scheint im Moment zu funktionieren, selbst über die MSDN-Suche ...
Jeroenh

Die Links sind jetzt in Ordnung
Anand

Dies ermöglicht Rennbedingungen, siehe die akzeptierte Antwort .
ComFreek

27

Sie können den Pfad, falls er noch nicht vorhanden ist, mit einer Methode wie der folgenden erstellen:

using System.IO;

private void CreateIfMissing(string path)
{
  bool folderExists = Directory.Exists(Server.MapPath(path));
  if (!folderExists)
    Directory.CreateDirectory(Server.MapPath(path));
}

6
Überprüfung if (!folderExists)ist nicht erforderlich.
bazzilic

8
@bazzilic ja, aber es zeigt Absicht. Ich muss nicht raten (oder sicher wissen), wie die API damit umgeht. Jeder, der diesen Code liest, weiß genau, was passieren wird.
Dennis Traub

4
In Multithread-Umgebungen (z. B. dem Status eines Dateisystems) haben Sie immer nur die Wahl zwischen Sperren oder Try-and-Catch. Das obige Snippet hat eine Rennbedingung. Die Funktion könnte eine FileExistsAusnahme auslösen (oder wie auch immer es in C # heißt)
Jo So

9
"es offenbart Absicht" - Dies ist keine gute Rechtfertigung. Sie können einfach einen Kommentar in den Code schreiben.
Jim Balter

15

Diese Methode erstellt einen Ordner, wenn er nicht vorhanden ist, und führt nichts aus, wenn er vorhanden ist

Directory.CreateDirectory(path);

15

Sie können eine try / catch-Klausel verwenden und prüfen, ob sie vorhanden ist:

  try
  {
    if (!Directory.Exists(path))
    {
       // Try to create the directory.
       DirectoryInfo di = Directory.CreateDirectory(path);
    }
  }
  catch (IOException ioex)
  {
     Console.WriteLine(ioex.Message);
  }

8
Dies ist eine gute Antwort, aber laut MSDN-Dokumentation werden alle im Pfad angegebenen Verzeichnisse erstellt, es sei denn, sie sind bereits vorhanden oder ein Teil des Pfads ist ungültig. Der Parameter path gibt einen Verzeichnispfad und keinen Dateipfad an Wenn das Verzeichnis bereits vorhanden ist, führt diese Methode nichts aus. " Sie brauchen den Aufruf von Directory.Exists (Pfad) also nicht wirklich.
Ken

2
Das ist wahr, aber das ist auch eine Annahme, so dass es immer am besten ist, zu überprüfen, anstatt anzunehmen, unabhängig davon, was MSDN sagt.
MethodMan

6
@ DJ KRAZE, ich glaube MSDN, es sei denn, es hat sich als falsch erwiesen. Sie empfehlen das Gegenteil - ignorieren Sie die Aussagen von MSDN und fügen Sie Ihrem Code zusätzliche (unnötige) Überprüfungen hinzu. Wo ziehst du die Grenze?
Polyfun

1
ShellShock nirgends sage ich ignorieren .. dies ist eine hartnäckige Aussage Ich sage, es ist besser, nicht anzunehmen als anzunehmen .. lesen Sie, was ich noch einmal gesagt habe .. danke
MethodMan

3
@DJKRAZE niemand nimmt etwas an. Im Handbuch ist in einfachem Englisch geschrieben, dass keine Überprüfung erforderlich ist.
bazzilic

14
using System.IO

if (!Directory.Exists(yourDirectory))
    Directory.CreateDirectory(yourDirectory);

12
if (!Directory.Exists(Path.GetDirectoryName(fileName)))
{
    Directory.CreateDirectory(Path.GetDirectoryName(fileName));
}

3
CreateDirectory prüft bereits, ob das Verzeichnis nicht vorhanden ist.
Bergmeister

6

Der folgende Code ist die beste (n) Codezeile (n), die ich verwende, um ein Verzeichnis zu erstellen, wenn es nicht vorhanden ist.

System.IO.Directory.CreateDirectory(HttpContext.Current.Server.MapPath("~/temp/"));

Wenn das Verzeichnis bereits vorhanden ist, erstellt diese Methode kein neues Verzeichnis, sondern gibt ein DirectoryInfo-Objekt für das vorhandene Verzeichnis zurück. >


CreateDirectory prüft bereits, ob das Verzeichnis nicht vorhanden ist.
Bergmeister

@bergmeister, danke .Ich habe gerade gekreuzt. Es hat wirklich bedingte Prüfung entfernt .Updated !!
UJS

5

Erstellen Sie einen neuen Ordner mit dem Pfad eines übergeordneten Ordners:

        string pathToNewFolder = System.IO.Path.Combine(parentFolderPath, "NewSubFolder");
        DirectoryInfo directory = Directory.CreateDirectory(pathToNewFolder); 
       // Will create if does not already exist (otherwise will ignore)
  • Pfad zum neuen Ordner angegeben
  • Verzeichnisinfo-Variable, damit Sie sie nach Belieben weiter bearbeiten können.

0

Verwenden Sie den folgenden Code. Ich habe diesen Code zum Kopieren von Dateien und zum Erstellen eines neuen Ordners verwendet.

string fileToCopy = "filelocation\\file_name.txt";
String server = Environment.UserName;
string newLocation = "C:\\Users\\" + server + "\\Pictures\\Tenders\\file_name.txt";
string folderLocation = "C:\\Users\\" + server + "\\Pictures\\Tenders\\";
bool exists = System.IO.Directory.Exists(folderLocation);

if (!exists)
{
   System.IO.Directory.CreateDirectory(folderLocation);
   if (System.IO.File.Exists(fileToCopy))
   {
     MessageBox.Show("file copied");
     System.IO.File.Copy(fileToCopy, newLocation, true);

   }
   else
   {
      MessageBox.Show("no such files");

   }
}

0

string createfolder = "E: / tmp /" + uId;
System.IO.Directory.CreateDirectory (Erstellungsordner);


0

Verwenden Sie diesen Code, wenn der Ordner nicht unter dem Bildordner oder anderen Ordnern angezeigt wird

 string subPath = HttpContext.Current.Server.MapPath(@"~/Images/RequisitionBarCode/");
            bool exists = System.IO.Directory.Exists(subPath);
            if(!exists)
            System.IO.Directory.CreateDirectory(subPath); 
string path = HttpContext.Current.Server.MapPath(@"~/Images/RequisitionBarCode/" + OrderId + ".png");

-1

Eine ausgefallene Möglichkeit besteht darin, die FileUploadmit der gewünschten Methode zu erweitern .

Füge das hinzu:

public static class FileUploadExtension
{
    public static void SaveAs(this FileUpload, string destination, bool autoCreateDirectory) { 

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

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

        file.SaveAs(destination);
    }
}

Dann benutze es:

FileUpload file;
...
file.SaveAs(path,true);

-3
string root = @"C:\Temp";

string subdir = @"C:\Temp\Mahesh";

// If directory does not exist, create it.

if (!Directory.Exists(root))
{

Directory.CreateDirectory(root);

}

Das CreateDirectory wird auch zum Erstellen eines Unterverzeichnisses verwendet. Sie müssen lediglich den Pfad des Verzeichnisses angeben, in dem dieses Unterverzeichnis erstellt wird. Mit dem folgenden Codeausschnitt wird ein Mahesh-Unterverzeichnis erstellt C:\Temp directory.

// Create sub directory

if (!Directory.Exists(subdir))
{

Directory.CreateDirectory(subdir);

}

-5

Aus mehreren Antworten abgeleitet / kombiniert, war die Implementierung für mich so einfach:

public void Init()
{
    String platypusDir = @"C:\platypus";
    CreateDirectoryIfDoesNotExist(platypusDir);
}

private void CreateDirectoryIfDoesNotExist(string dirName)
{
    System.IO.Directory.CreateDirectory(dirName);
}

6
Was bringt es, eine Methode in eine im Wesentlichen exakte Kopie mit nur einem geringfügig anderen Namen zu kapseln? Sie gewinnen buchstäblich nichts davon.
Krythic
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.