2016-03-31 22 views
5

差分操作のログを作成します。私はファイル名として日付を付けて毎日新しいファイルを作成します。今、もしディレクトリが存在しなければ、私はシステムが私のためにディレクトリを作ってほしい。私はこのトピックを検索し、すべての答えが同じものに来る:Directory.CreateDirectory(FilePath);を使用してください。しかし、これは動作しないようです。明白な何かが欠けているかもしれません。ディレクトリが存在しない場合は作成してください

ここでは、コードです:

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

エラーメッセージ:

タイプの例外が 'System.IO.DirectoryNotFoundException' がmscorlib.dllで を発生しますが、ユーザーコード

で処理されていませんでした

追加情報: 'C:¥Users¥***¥Source¥Repos¥Project¥ProjectName¥Logs¥WZCLogs¥31032016.txt'のパスの一部を見つけることができませんでした。

+0

エラーメッセージや説明がありますか? –

+2

作成するディレクトリの絶対パスを指定しようとしましたか?また、 'Path.Combine'を使ってパスを結合すると、ディレクトリの区切り文字を心配する必要がなくなります。 –

+0

FilePath変数はおそらく完全ではありませんか? –

答えて

7

C:\(OSがインストールされているデフォルトのドライブ)にフォルダが作成されることがあります。つまり、フォルダの場所はC:\Logs\WZCLogs\です。コードを再度実行して、ドライブのどこかにフォルダが作成されたことを確認できます。今度はif (!Directory.Exists(FilePath))trueを返します。コンパイラがどこにも指定していないので、そうです。作成されているかどうかを確認します。

あなたはこのようにしてみてください拡張することができます:パスは間違いなく例外がスローされます間違ったものである場合

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

。私は試してみました「X:\サンプル」私に例外を与える:

パス「Xの一部が見つかりませんでした:\サンプル私はLogs\WZCLogsにしようとしたかのように与える習慣

を最初の例外と2回目のifもスキップします。したがって、私はフォルダがどこか他の場所に作成されていることがわかりました。

あなたはそれらを動作させるために、これらの変更を行うことができます。

string FilePath=Path.Combine(HostingEnvironment.ApplicationPhysicalPath, @"Logs\WZCLogs"); 
+0

これは私の問題のおかげで解決しました。 – ckindt

+1

//指定されたパスにすべてのディレクトリとサブディレクトリを作成します(すでに存在していない場合は除きます)。 public static DirectoryInfo CreateDirectory(文字列パス)。 –

3

あなたはディレクトリを作成するときに、絶対パスを使用する必要があります。次のことを試してみてください。

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

あなたは、ディレクトリがすでに存在する場合CreateDirectoryメソッドは副作用を持っていないなどのディレクトリが最初に存在しているかどうかをチェックする必要はありません。文字列を直接連結するのではなくPath.Combineを使用することをお勧めしますが、2番目のパラメータがスラッシュで始まらないようにしてください。

FileStreamを作成する代わりに、File.AppendAllTextメソッドを使用してコードを単純化することもできます。

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

私のコードを簡素化してくれてありがとう、魅力的です。 – ckindt

関連する問題