943 votes

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

J'utilise un FileUploader dans mon application. Je veux enregistrer un fichier dans un dossier spécifié. 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à, il suffit d'y enregistrer le fichier.

Comment puis-je le faire ?

0 votes

@JoeBlow - Ha - il aurait fallu préciser quelle réponse est incorrecte - maintenant la page est encore plus confuse. (A-t-il changé la réponse acceptée ? ou non ? OMG !) ;-)

1 votes

J'ai atterri ici en cherchant d'autres choses, mais il est étonnant de voir le nombre de personnes qui 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, comme Mono, n'a rien à voir avec l'exactitude du comportement décrit dans MSDN. Oh, et Mono fait aussi la bonne chose, alors où est l'argument ?

2 votes

1501voto

Mark Peters Points 2118

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

Mais, vous n'avez pas besoin de vérifier d'abord s'il existe. À partir de la documentation :

Tous les répertoires spécifiés dans le chemin sont créés, sauf s'ils existent déjà ou si une partie du chemin est invalide. 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.

46 votes

51 votes

Et pourtant l'exemple du code Microsoft se contredit en vérifiant d'abord si le répertoire existe...

1 votes

Nous devons donc vérifier s'il existe ou non ? Si nous vérifions et qu'ensuite la méthode CreateDirectory vérifie à nouveau, nous effectuons la vérification deux fois... et les opérations sur le système de fichiers sont coûteuses (AFAIK).

419voto

Ravia Points 4797

Utilisez le code ci-dessous comme indiqué Comment puis-je créer un dossier de manière dynamique en utilisant le contrôle de serveur de téléchargement de fichiers ? :

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

0 votes

Désolé, j'ai oublié d'ajouter le lien.

0 votes

totaldotnet.com/Tip/ShowTip22_UsePhysicalAppPath.aspx Server.MapPath vs PhysicalApplicationPath. Êtes-vous d'accord ?

48 votes

Pourquoi pas : if (!Directory.Exists(path_to_check)) Directory.CreateDirectory(path_to_check) ;

294voto

Nicolas Raoul Points 13912

Il suffit d'écrire cette ligne :

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

Référence : Article sur Directory.CreateDirectory à MSDN

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

1 votes

Tout le monde parle de la même réponse, mais j'ai aimé la simplicité avec laquelle elle est expliquée ici. Beaucoup plus facile et rapide à comprendre. +1 de ma part

31voto

jeroenh Points 12777

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

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

0 votes

@Tavousi ces fonctions fournies par jeroenh seraient un bon début ;)

0 votes

Aucun des liens de la documentation msdn ne semble fonctionner pour le moment, même via la recherche msdn...

0 votes

Les liens sont bien maintenant

29voto

Dennis Traub Points 24186

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

8 votes

Vérifiez if (!folderExists) n'est pas nécessaire.

10 votes

@bazzilic oui, mais cela révèle l'intention. Je n'ai pas à deviner (ou à savoir avec certitude) comment l'API gère cela. Toute personne qui lit ce code sait avec certitude ce qui se passe.

5 votes

Dans les environnements multithreads (comme l'état d'un système de fichiers), vous n'avez jamais le choix qu'entre le verrouillage et le try-and-catch. L'extrait ci-dessus présente une condition de course. La fonction peut lancer un FileExists Exception (ou quel que soit son nom en C#)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X