Comment créer un répertoire s'il n'existe pas pour créer un fichier?

202

J'ai un morceau de code ici qui se casse si le répertoire n'existe pas:

System.IO.File.WriteAllText(filePath, content);

En une ligne (ou en quelques lignes), est-il possible de vérifier si le répertoire menant au nouveau fichier n'existe pas et sinon, de le créer avant de créer le nouveau fichier?

J'utilise .NET 3.5.

Disque
la source
1
Duplication possible de Si un dossier n'existe pas, créez-le
Michael Freidgeim
@TimSchmelter, "Possible duplicate" est un moyen de nettoyer - pour fermer des questions similaires et en garder une avec les meilleures réponses. La date n'est pas indispensable. Voir meta.stackexchange.com/questions/147643/… Si vous acceptez que cela nécessite des clarifications, veuillez voter sur meta.stackexchange.com/questions/281980/…
Michael Freidgeim

Réponses:

394

Créer

(new FileInfo(filePath)).Directory.Create() Avant d'écrire dans le fichier.

.... Ou, s'il existe, alors créez (sinon ne faites rien)

System.IO.FileInfo file = new System.IO.FileInfo(filePath);
file.Directory.Create(); // If the directory already exists, this method does nothing.
System.IO.File.WriteAllText(file.FullName, content);
Don
la source
5
Solution élégante car elle gère les situations qui nécessitent la création de dossiers imbriqués.
Denny Jacob
Je vous remercie! J'ai vu stackoverflow.com/questions/9065598 , mais je voulais commencer par le chemin absolu vers un fichier, et je ne voulais pas gérer la division du chemin. Maintenant, je sais que vous pouvez accéder au répertoire à partir de l'instance FileInfo.
Johann
Existe-t-il un moyen asynchrone de procéder?
Joe Phillips
1
Je suppose que tu pourrais le faire avec Task.Run(() => );.
Don
107

Vous pouvez utiliser le code suivant

  DirectoryInfo di = Directory.CreateDirectory(path);
RAM
la source
41
Directory.CreateDirectoryfait exactement ce que vous voulez: il crée le répertoire s'il n'existe pas encore. Il n'est pas nécessaire de faire une vérification explicite en premier .
Paolo Moretti du
13
Lève une exception IOException si pathest un fichier et non un répertoire. msdn.microsoft.com/en-us/library/54a0at6s(v=vs.110).aspx
scaryman
34

Comme l'a dit @hitec, vous devez vous assurer que vous avez les bonnes autorisations, si vous le faites, vous pouvez utiliser cette ligne pour garantir l'existence du répertoire:

Directory.CreateDirectory(Path.GetDirectoryName(filePath))

willvv
la source
0

Une manière élégante de déplacer votre fichier vers un répertoire inexistant consiste à créer l'extension suivante à la classe FileInfo native:

public static class FileInfoExtension
{
    //second parameter is need to avoid collision with native MoveTo
    public static void MoveTo(this FileInfo file, string destination, bool autoCreateDirectory) { 

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

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

        file.MoveTo(destination);
    }
}

Utilisez ensuite la toute nouvelle extension MoveTo:

 using <namespace of FileInfoExtension>;
 ...
 new FileInfo("some path")
     .MoveTo("target path",true);

Consultez la documentation de l'extension des méthodes .

MiguelSlv
la source
-1

Vous pouvez utiliser File.Exists pour vérifier si le fichier existe et le créer à l'aide de File.Create si nécessaire. Assurez-vous de vérifier si vous avez accès à la création de fichiers à cet emplacement.

Une fois que vous êtes certain que le fichier existe, vous pouvez y écrire en toute sécurité. Bien que par précaution, vous devriez mettre votre code dans un bloc try ... catch et intercepter les exceptions que la fonction est susceptible de déclencher si les choses ne se passent pas exactement comme prévu.

Informations supplémentaires pour les concepts d'E / S de fichiers de base .

haute technologie
la source
J'ai initialement mal lu votre question que vous vouliez écrire dans un fichier qui pourrait ne pas exister. Cependant, les concepts sont essentiellement les mêmes pour les E / S de fichiers et de répertoires.
hitec
-2

var filePath = context.Server.MapPath(Convert.ToString(ConfigurationManager.AppSettings["ErrorLogFile"]));

var file = new FileInfo(filePath);

file.Directory.Create(); Si le répertoire existe déjà, cette méthode ne fait rien.

var sw = new StreamWriter(filePath, true);

sw.WriteLine(Enter your message here);

sw.Close();

Godwin Awojobi
la source