web-dev-qa-db-fra.com

Créer un répertoire s'il n'existe pas

Je veux créer des journaux pour différentes actions. Je crée un nouveau fichier chaque jour avec la date comme nom de fichier. Maintenant, si le répertoire n'existe pas, je veux que le système crée le répertoire pour moi. J'ai cherché ce sujet et toutes les réponses reviennent à la même chose: utilisez Directory.CreateDirectory(FilePath);. Cependant, cela ne semble pas fonctionner. Il pourrait manquer quelque chose d'évident.

Voici le code:

public class ElderlyHomeLog : ILog
    {
        private const string FilePath = "/Logs/WZCLogs/";
        public void MakeLog(string text)
        {
            if (!Directory.Exists(FilePath))
            {
                Directory.CreateDirectory(FilePath);
            }
            string logFile = DateTime.Now.ToString("ddMMyyyy") + ".txt";
            if (!File.Exists(HostingEnvironment.ApplicationPhysicalPath + FilePath + logFile))
            {
                FileStream f = File.Create(HostingEnvironment.ApplicationPhysicalPath + FilePath + logFile);
                f.Close();
            }

            using (StreamWriter sw = new StreamWriter(HostingEnvironment.ApplicationPhysicalPath + FilePath + logFile, true))
            {
                sw.WriteLine(text);
                sw.Close();
            }
        }
    }

Message d'erreur:

Une exception de type "System.IO.DirectoryNotFoundException" s'est produite dans mscorlib.dll mais n'a pas été gérée dans le code utilisateur

Informations supplémentaires: Impossible de trouver une partie du chemin d'accès "C:\Users\***\Source\Repos\Project\ProjectName\Logs\WZCLogs\31032016.txt".

12
ckindt

Le dossier peut être créé dans votre C:\ (Le lecteur par défaut sur lequel le système d'exploitation est installé). l'emplacement du dossier est C:\Logs\WZCLogs\. vous pouvez confirmer qu'un dossier est créé quelque part dans le lecteur en exécutant à nouveau le code, cette fois la if (!Directory.Exists(FilePath)) renvoie true. Puisque vous n'avez spécifié aucun emplacement, le compilateur suppose So. Vérifiez s'il est créé ou non;

Vous pouvez étendre l'essai comme ceci:

try
{
    Directory.CreateDirectory(FilePath);
}
catch (Exception ex)
{
    // handle them here
}

Si le chemin est incorrect, une exception sera levée; J'ai essayé avec "X:\sample" ce qui me donne l'exception:

Impossible de trouver une partie du chemin 'X:\exemple

Considérant que si j'ai essayé avec Logs\WZCLogs Qui ne donnera aucune exception pour la première fois et sautera également le if pour la deuxième fois; Par conséquent, j'ai trouvé que le dossier est créé ailleurs;

Vous pouvez apporter ces modifications pour les faire fonctionner:

 string FilePath=Path.Combine(HostingEnvironment.ApplicationPhysicalPath, @"Logs\WZCLogs");
16
sujith karivelil

Vous devez utiliser le chemin absolu lors de la création du répertoire. Essayez ce qui suit:

private const string FilePath = "Logs/WZCLogs/";

public void MakeLog(string text)
{
     string directory = Path.Combine(HostingEnvironment.ApplicationPhysicalPath, FilePath);
     Directory.CreateDirectory(directory); // no need to check if it exists

     string logFile = Path.Combine(directory, DateTime.Now.ToString("ddMMyyyy") + ".txt");
     if (!File.Exists(logFile))
     {
         FileStream f = File.Create(logFile);
         f.Close();
     }

     using (StreamWriter sw = new StreamWriter(logFile, true))
     {
         sw.WriteLine(text);
         sw.Close();
     }
}

Vous n'avez pas besoin de vérifier si le répertoire existe d'abord car la méthode CreateDirectory n'a pas d'effets secondaires si le répertoire est déjà présent. Il est également recommandé d'utiliser Path.Combine plutôt que de concaténer directement des chaînes, mais assurez-vous que le deuxième paramètre ne commence pas par une barre oblique.

Vous pouvez également simplifier votre code en utilisant le File.AppendAllText au lieu de créer un FileStream.

private const string FilePath = "Logs/WZCLogs/";

public void MakeLog(string text)
{
    string directory = Path.Combine(HostingEnvironment.ApplicationPhysicalPath, FilePath);
    Directory.CreateDirectory(directory);

    string logFile = Path.Combine(directory, DateTime.Now.ToString("ddMMyyyy") + ".txt");
    File.AppendAllText(logFile, text + Environment.NewLine);
}
3
Alsty