Se non esiste una cartella, crearla


720

Uso un controllo FileUploader nella mia applicazione. Voglio salvare un file in una cartella specificata. Ora voglio, se questa cartella non esiste, prima crearla, quindi salvare il mio file in questa cartella. Se la cartella esiste già, salva semplicemente il file al suo interno.

Come posso farlo?


@JoeBlow - Ah - avrebbe dovuto specificare quale risposta non è corretta - ora la pagina è ancora più confusa. (Ha cambiato la risposta accettata? O no? OMG!) ;-)
Bartosz,

Sono finito qui mentre cercavo altre cose, ma è incredibile quante persone stanno combattendo per contraddirsi a vicenda con la propria versione della stessa storia. Microsoft ha creato .NET Framework e MSDN. Il rispetto del comportamento corretto da parte di altri implementatori, come Mono, è irrilevante per la correttezza del comportamento descritto in MSDN. Oh, e Mono fa anche la cosa giusta, quindi dov'è l'argomento?
monkey0506,

Risposte:


1239

Come altri hanno già detto, usa System.IO.Directory.CreateDirectory

Ma non è necessario verificare se esiste prima. Dai documenti

Vengono create tutte le directory specificate nel percorso, a meno che non esistano già o a meno che una parte del percorso non sia valida. Se la directory esiste già, questo metodo non crea una nuova directory, ma restituisce un oggetto DirectoryInfo per la directory esistente.



25
eppure l'esempio del codice microsoft si contraddice controllando se la directory esiste prima ...
ecoe

1
Quindi dobbiamo verificare se esiste o no? Se controlliamo e poi ricontrolliamo anche il metodo CreateDirectory, eseguiamo il controllo due volte ... e il funzionamento del filesystem AFAIK è costoso
Giox,

3
@Muflix in questo modo: crea un file, ad esempio "FILENAME" in una directory, ma non assegnalo alcuna estensione. Quindi prova a chiamare Directory.Exists ("FILENAME") restituirà false, come dovrebbe perché non esiste tale directory. Ora se chiami CreateDirectory ("FILENAME") fallirà miseramente come dovrebbe perché c'è già "qualcosa" con quel nome lì. Spero che abbia un senso.
Otávio Décio,

1
SBAGLIATO! I DEVI verificare se la cartella esiste. Ho appena identificato che questo metodo ha un problema serio. Se non si verifica l'esistenza della cartella, l'handle della cartella perderà se non lo si rilascia specificamente. Abbiamo usato questo esempio in un'applicazione che elabora milioni di cartelle. Ogni volta che veniva chiamato questo metodo, l'applicazione conservava l'handle del file nella directory. Dopo diverse ore, il NAS della rete aziendale aveva milioni di handle di file aperti nelle cartelle. Aggiornamento per includere l'assegno gratuito è la maniglia
soddoff Baldrick

356

Utilizzare il codice seguente come 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
Perché no: if (! Directory.Exists (path_to_check)) Directory.CreateDirectory (path_to_check);
Dayan,

159
Non è necessario verificare l'esistenza della cartella. Leggi attentamente il manuale.
bazzilic,

30
Il controllo e la creazione non sono atomici. Il codice sopra ha un odore, c'è una condizione di gara. Dovresti semplicemente creare la directory incondizionatamente e prendere FileExistsun'eccezione (o qualunque sia l'equivalente in C #) nel caso in cui la funzione sia progettata per lanciarne una.
Jo So,

6
Come altri hanno sottolineato, la chiamata a non è necessaria Existse crea effettivamente una nuova condizione di errore.
Ed S.

3
@MartinSmith: Quindi basta creare la directory. Non verificare l'esistenza prima. Questo non è solo più breve. Inoltre non dà una falsa impressione di cosa sia l'API System.IO.Directory.CreateDirectory. (Ed è più veloce, ma probabilmente non importa)
Jo So

224

Basta scrivere questa riga:

System.IO.Directory.CreateDirectory("my folder");
  • Se la cartella non esiste ancora , verrà creata .
  • Se la cartella esiste già , la riga verrà ignorata .

Riferimento: articolo su Directory.CreateDirectory su MSDN

Ovviamente, puoi anche scrivere using System.IO;nella parte superiore del file sorgente e quindi scrivere Directory.CreateDirectory("my folder");ogni volta che vuoi creare una cartella.


28

Directory.CreateDirectory Spiega come provare e creare FilePath se non esiste

Directory.ExistsSpiega come verificare se esiste un FilePath. Tuttavia, non è necessario in quanto CreateDirectory controllerà per te.


@Tavousi questa funzione fornita da jeroenh sarebbe un buon inizio;)
Allan Chua

nessuno dei collegamenti di documentazione msdn sembra funzionare al momento, anche tramite la ricerca
msdn

i collegamenti ora vanno bene
Anand

Questo abilita le condizioni di gara, vedi la risposta accettata .
ComFreek,

27

È possibile creare il percorso se non esiste ancora con un metodo come il seguente:

using System.IO;

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

6
Il controllo if (!folderExists)non è necessario.
bazzilic,

8
@bazzilic sì, ma rivela intento. Non devo indovinare (o sapere con certezza) come l'API gestisce questo. Chiunque legga questo codice saprà con certezza cosa accadrà.
Dennis Traub,

4
In ambienti multithread (come lo stato di un filesystem) hai sempre e solo la scelta di bloccare o provare e catturare. Lo snippet sopra ha una condizione di razza. La funzione potrebbe generare FileExistsun'eccezione (o come viene chiamata in C #)
Jo So,

9
"rivela l'intento" - Questa non è una buona giustificazione. Potresti semplicemente scrivere un commento nel codice.
Jim Balter,

15

Questo metodo creerà una cartella se non esiste e non farà nulla se esiste

Directory.CreateDirectory(path);

15

È possibile utilizzare una clausola try / catch e verificare se esiste:

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

8
Questa è una buona risposta, ma, secondo la documentazione MSDN, "Vengono create tutte le directory specificate nel percorso, a meno che non esistano già o a meno che una parte del percorso non sia valida. Il parametro path specifica un percorso di directory, non un percorso di file Se la directory esiste già, questo metodo non fa nulla. " Quindi, non hai davvero bisogno della chiamata a Directory.Exists (percorso).
Ken,

2
È vero, ma è anche un'ipotesi, quindi è sempre meglio controllare piuttosto che assumere indipendentemente da ciò che dice MSDN ..
MethodMan

6
@DJ KRAZE, credo MSDN a meno che non sia stato dimostrato che è sbagliato. Si consiglia il contrario: ignora ciò che dice MSDN e aggiungi controlli extra (non necessari) al tuo codice. Dove disegni la linea?
Polyfun,

1
ShellShock non dico da nessuna parte di ignorare .. questa è un'affermazione perspicace che sto dicendo è meglio non assumere che assumere .. leggi quello che ho affermato ancora una volta .. grazie
MethodMan

3
@DJKRAZE nessuno si assume niente. È scritto in inglese nel manuale che non è necessario controllare.
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 gestisce già il controllo se la directory non esiste.
bergmeister,

6

Il seguente codice è la migliore linea (e) di codice che uso che creerà directory se non presente.

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

Se la directory esiste già, questo metodo non crea una nuova directory, ma restituisce un oggetto DirectoryInfo per la directory esistente. >


CreateDirectory gestisce già il controllo se la directory non esiste.
bergmeister,

@bergmeister, grazie. Ho appena attraversato il controllo. Ha davvero rimosso il controllo condizionale. Aggiornato !!
UJS,

5

Crea una nuova cartella, dato il percorso di una cartella principale:

        string pathToNewFolder = System.IO.Path.Combine(parentFolderPath, "NewSubFolder");
        DirectoryInfo directory = Directory.CreateDirectory(pathToNewFolder); 
       // Will create if does not already exist (otherwise will ignore)
  • percorso della nuova cartella fornita
  • variabile info directory in modo da poter continuare a manipolarla come preferisci.

0

Usa sotto il codice. Ho usato questo codice per copiare il file e creare una nuova cartella.

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


0

Utilizzare questo codice se la cartella non è presentata nella cartella immagine o in altre cartelle

 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

Un modo elegante è estendere FileUploadil metodo desiderato.

Aggiungi questo:

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

Quindi usalo:

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

}

CreateDirectory viene anche utilizzato per creare una sottodirectory. Tutto quello che devi fare è specificare il percorso della directory in cui verrà creata questa sottodirectory. Il frammento di codice seguente crea una sottodirectory Mahesh C:\Temp directory.

// Create sub directory

if (!Directory.Exists(subdir))
{

Directory.CreateDirectory(subdir);

}

-5

Derivato / combinato da più risposte, implementarlo per me è stato facile come questo:

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

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

6
Qual è lo scopo di incapsulare un metodo in ciò che è essenzialmente una copia esatta, con solo un nome leggermente diverso? Non ottieni letteralmente nulla da questo.
Krythic,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.