Si un dossier n'existe pas, créez-le

720

J'utilise un contrôle FileUploader dans mon application. Je souhaite enregistrer un fichier dans un dossier spécifié. Maintenant, si ce dossier n'existe pas, je veux d'abord le créer, puis enregistrer mon fichier dans ce dossier. Si le dossier existe déjà, enregistrez-y simplement le fichier.

Comment puis-je faire ceci?

Tavousi
la source
@JoeBlow - Ha - aurait dû spécifier quelle réponse est incorrecte - maintenant la page est encore plus déroutante. (A-t-il changé la réponse acceptée? Ou non? OMG!) ;-)
Bartosz
Je me suis retrouvé ici en cherchant d'autres choses, mais c'est incroyable combien de personnes se battent pour se contredire avec leur propre version de la même histoire. Microsoft est l'auteur du .NET Framework et du MSDN. Le fait que le comportement correct soit respecté par d'autres implémenteurs, tels que Mono, n'est pas pertinent pour l'exactitude du comportement décrit dans MSDN. Oh, et Mono fait la bonne chose aussi, alors où est l'argument?
monkey0506

Réponses:

1239

Comme d’autres l’ont dit, utilisez System.IO.Directory.CreateDirectory

Mais, vous n'avez pas besoin de vérifier s'il existe en premier. À partir des documents

Tous les répertoires spécifiés dans path sont créés, sauf s'ils existent déjà ou si une partie du chemin n'est pas valide. Si le répertoire existe déjà, cette méthode ne crée pas de nouveau répertoire, mais elle renvoie un objet DirectoryInfo pour le répertoire existant.

Mark Peters
la source
25
et pourtant l'exemple de code Microsoft se contredit en vérifiant si le répertoire existe en premier ...
ecoe
1
Il faut donc vérifier s'il existe ou non? Si nous vérifions puis vérifions à nouveau la méthode CreateDirectory, nous effectuons la vérification deux fois ... et le fonctionnement du système de fichiers AFAIK coûte cher
Giox
3
@Muflix comme ceci - créez un fichier par exemple "FILENAME" sur un répertoire mais ne lui donnez aucune extension. Ensuite, essayez d'appeler Directory.Exists ("FILENAME") retournera false, comme il se doit car il n'y a pas de tel répertoire. Maintenant, si vous appelez CreateDirectory ("FILENAME"), il échouera misérablement comme il se doit car il y a déjà "quelque chose" avec ce nom là. J'espère que cela a du sens.
Otávio Décio
1
FAUX! I Vous DEVEZ vérifier si le dossier existe. Je viens d'identifier que cette méthode a un sérieux problème. Si vous ne vérifiez pas l'existence du dossier, le descripteur du dossier fuira à moins que vous ne le libériez spécifiquement. Nous avons utilisé cet exemple dans une application qui traite des millions de dossiers. Chaque fois que cette méthode était appelée, l'application conservait le descripteur de fichier dans le répertoire. Après plusieurs heures, le NAS du réseau d'entreprise avait des millions de descripteurs de fichiers ouverts sur les dossiers. Mise à jour pour inclure le chèque gratuit de la poignée
soddoff Baldrick
356

Utilisez le code ci-dessous selon 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
la source
41
Pourquoi pas: if (! Directory.Exists (path_to_check)) Directory.CreateDirectory (path_to_check);
Dayan
159
Pas besoin de vérifier si le dossier existe. Lisez attentivement le manuel.
bazzilic
30
Vérifier et créer n'est pas atomique. Le code ci-dessus sent, il y a une condition de concurrence. Vous devriez mieux créer inconditionnellement le répertoire et intercepter une FileExistsexception (ou quelque soit l'équivalent en C #) au cas où la fonction est conçue pour en lancer une.
Jo So
6
Comme d'autres l'ont souligné, l'appel à n'est pas nécessaire Existset crée en fait une nouvelle condition d'échec.
Ed S.
3
@MartinSmith: Ensuite, créez simplement le répertoire. Ne vérifiez pas l'existence avant. Ce n'est pas seulement plus court. Cela ne donne pas non plus une fausse impression de ce qu'est l'API System.IO.Directory.CreateDirectory. (Et c'est plus rapide, mais cela n'a probablement pas d'importance)
Jo So
224

Écrivez simplement cette ligne:

System.IO.Directory.CreateDirectory("my folder");
  • Si le dossier n'existe pas encore , il sera créé .
  • Si le dossier existe déjà , la ligne sera ignorée .

Référence: article sur Directory.CreateDirectory sur MSDN

Bien sûr, vous pouvez également écrire using System.IO;en haut du fichier source, puis simplement écrire Directory.CreateDirectory("my folder");chaque fois que vous souhaitez créer un dossier.

Nicolas Raoul
la source
28

Directory.CreateDirectory Explique comment essayer et créer le FilePath s'il n'existe pas

Directory.ExistsExplique comment vérifier si un FilePath existe. Cependant, vous n'en avez pas besoin car CreateDirectory vérifiera pour vous.

jeroenh
la source
@Tavousi ces fonctions fournies par jeroenh seraient un bon début;)
Allan Chua
aucun des liens de documentation msdn ne semble fonctionner pour le moment, même via la recherche msdn ...
jeroenh
les liens vont bien maintenant
Anand
Cela permet des conditions de course, voir la réponse acceptée .
ComFreek
27

Vous pouvez créer le chemin s'il n'existe pas encore avec une méthode comme la suivante:

using System.IO;

private void CreateIfMissing(string path)
{
  bool folderExists = Directory.Exists(Server.MapPath(path));
  if (!folderExists)
    Directory.CreateDirectory(Server.MapPath(path));
}
Dennis Traub
la source
6
La vérification if (!folderExists)n'est pas nécessaire.
bazzilic
8
@bazzilic oui, mais cela révèle une intention. Je n'ai pas à deviner (ou savoir avec certitude) comment l'API gère cela. Quiconque lit ce code saura avec certitude ce qui se passera.
Dennis Traub
4
Dans les environnements multithreads (tels que l'état d'un système de fichiers), vous n'avez que le choix de verrouiller ou d'essayer et d'attraper. L'extrait ci-dessus a une condition de concurrence. La fonction peut lever une FileExistsexception (ou tout autre nom en C #)
Jo So
9
"il révèle l'intention" - Ce n'est pas une bonne justification. Vous pouvez simplement écrire un commentaire dans le code.
Jim Balter
15

Cette méthode crée un dossier s'il n'existe pas et ne fait rien s'il existe

Directory.CreateDirectory(path);
Thakur Rock
la source
15

Vous pouvez utiliser une clause try / catch et vérifier si elle existe:

  try
  {
    if (!Directory.Exists(path))
    {
       // Try to create the directory.
       DirectoryInfo di = Directory.CreateDirectory(path);
    }
  }
  catch (IOException ioex)
  {
     Console.WriteLine(ioex.Message);
  }
MethodMan
la source
8
Il s'agit d'une bonne réponse, mais, selon la documentation MSDN, «tous les répertoires spécifiés dans le chemin d'accès sont créés, sauf s'ils existent déjà ou si une partie du chemin d'accès n'est pas valide. Le paramètre path spécifie un chemin d'accès au répertoire, pas un chemin de fichier . Si le répertoire existe déjà, cette méthode ne fait rien. " Ainsi, vous n'avez pas vraiment besoin de l'appel à Directory.Exists (chemin).
ken
2
C'est vrai, mais c'est aussi une supposition, il est donc toujours préférable de vérifier plutôt que de supposer indépendamment de ce que MSDN dit ..
MethodMan
6
@DJ KRAZE, je crois que MSDN à moins qu'il ne soit prouvé qu'il est faux. Vous recommandez le contraire - ignorez ce que dit MSDN et ajoutez des contrôles supplémentaires (inutiles) dans votre code. Où tracez-vous la ligne?
Polyfun
1
ShellShock nulle part où je dis ignorer .. c'est une déclaration persévérante, je dis qu'il vaut mieux ne pas supposer que supposer .. lire ce que j'ai dit encore une fois .. merci
MethodMan
3
@DJKRAZE personne n'assume rien. Il est écrit en anglais simple dans le manuel que la vérification n'est pas nécessaire.
bazzilic
14
using System.IO

if (!Directory.Exists(yourDirectory))
    Directory.CreateDirectory(yourDirectory);
Ours noir
la source
12
if (!Directory.Exists(Path.GetDirectoryName(fileName)))
{
    Directory.CreateDirectory(Path.GetDirectoryName(fileName));
}
Kiran Solkar
la source
3
CreateDirectory gère déjà la vérification si le répertoire n'existe pas.
bergmeister
6

Le code suivant est la ou les meilleures lignes de code que j'utilise pour créer un répertoire s'il n'est pas présent.

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

Si le répertoire existe déjà, cette méthode ne crée pas de nouveau répertoire, mais elle renvoie un objet DirectoryInfo pour le répertoire existant. >

UJS
la source
CreateDirectory gère déjà la vérification si le répertoire n'existe pas.
bergmeister
@bergmeister, Merci. Je viens de cocher la case. Il a vraiment supprimé la vérification conditionnelle.
UJS
5

Créez un nouveau dossier, étant donné le chemin d'un dossier parent:

        string pathToNewFolder = System.IO.Path.Combine(parentFolderPath, "NewSubFolder");
        DirectoryInfo directory = Directory.CreateDirectory(pathToNewFolder); 
       // Will create if does not already exist (otherwise will ignore)
  • chemin d'accès au nouveau dossier donné
  • variable info répertoire afin que vous puissiez continuer à la manipuler à votre guise.
BKSpurgeon
la source
0

Utilisez le code ci-dessous. J'ai utilisé ce code pour copier des fichiers et créer un nouveau dossier.

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

   }
}
Lemon Kazi
la source
0

chaîne createfolder = "E: / tmp /" + uId;
System.IO.Directory.CreateDirectory (createfolder);

amit
la source
0

Utilisez ce code si le dossier n'est pas présenté sous le dossier image ou d'autres dossiers

 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
la source
-1

Une façon élégante consiste à étendre la FileUpload avec la méthode que vous souhaitez.

Ajoute ça:

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

Ensuite, utilisez-le:

FileUpload file;
...
file.SaveAs(path,true);
MiguelSlv
la source
-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 est également utilisé pour créer un sous-répertoire. Tout ce que vous avez à faire est de spécifier le chemin du répertoire dans lequel ce sous-répertoire sera créé. L'extrait de code suivant crée un sous-répertoire Mahesh dans C:\Temp directory.

// Create sub directory

if (!Directory.Exists(subdir))
{

Directory.CreateDirectory(subdir);

}
uksp
la source
-5

Dérivée / combinée à partir de plusieurs réponses, sa mise en œuvre a été aussi simple que cela:

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

private void CreateDirectoryIfDoesNotExist(string dirName)
{
    System.IO.Directory.CreateDirectory(dirName);
}
Clay Shannon
la source
6
Quel est l'intérêt d'encapsuler une méthode dans ce qui est essentiellement une copie exacte, avec seulement un nom légèrement différent? Vous n'y gagnez littéralement rien.
Krythic