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.



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

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


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


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 .


-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 .


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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.