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?

Tavousi
quelle
@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.

Mark Peters
quelle
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));
Ravia
quelle
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.

Nicolas Raoul
quelle
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.

jeroenh
quelle
@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));
}
Dennis Traub
quelle
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);
Thakur Rock
quelle
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);
  }
Method Man
quelle
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);
Schwarzbär
quelle
12
if (!Directory.Exists(Path.GetDirectoryName(fileName)))
{
    Directory.CreateDirectory(Path.GetDirectoryName(fileName));
}
Kiran Solkar
quelle
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. >

UJS
quelle
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.
BKSpurgeon
quelle
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");

   }
}
Zitrone Kazi
quelle
0

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

amit
quelle
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");
Jogi
quelle
-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);
MiguelSlv
quelle
-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);

}
uksp
quelle
-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);
}
B. Clay Shannon
quelle
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