2017-10-04 14 views
-1

複数のフォーラムとソリューションを読みましたが、解決できませんでした。次のコードの欠陥を私に教えてください。システムIO例外既に別のプロセスで使用されているためアクセスできません

public static void WriteLogFile(string writedata) 
    { 
     string path = @"C:\Example.txt"; 
     if (!File.Exists(path)) 
     { 
      File.Create(path); 
      TextWriter tw = new StreamWriter(path); 
      tw.WriteLine(writedata); 
      //tw.Close(); 
     } 
     else if (File.Exists(path)) 
     { 
      using (var tw = new StreamWriter(path, true)) 
      { 
       tw.WriteLine(writedata); 
       //tw.Close(); 
      } 
     } 
    } 
+1

'' else''ブロックで '' using() ''ではなく、 '' if''ではなく? –

+0

'File.Create(path);'を 'File.Create(Path).Dispose();' – Equalsk

+0

@Equalskに変更するか、単に行全体を削除すると、StreamWriterはファイルが存在しなければ作成します –

答えて

1

あなたが必要とするのはそれだけです。コンストラクタでStreamWriter(string, boolean)

は、デフォルトのエンコーディングとバッファを使用して指定されたファイルのStreamWriterクラスの新しいインスタンスを初期化し

public static void WriteLogFile(string writedata) 
{ 
    string path = @"C:\Example.txt"; 
    using (TextWriter tw = new StreamWriter(path, true)) 
     tw.WriteLine(writedata); 
} 

は、あなたが見つけるMSDN

を見てくださいサイズ。ファイルが存在する場合は、上書きまたは追加することができます。ファイルが存在しない場合、このコンストラクタは新しいファイルを作成します。あなたのメソッドがWriteLogFileと呼ばれているので

FYI、plsはホイールを再発明とのlog4netのようなロギングライブラリを使用していけません。

編集、そのは編集2

を働いていることの証明、マルチスレッドのシナリオを修正するには、次のようにコードを変更します。

private static readonly object _syncLock = new object(); 
public static void WriteLogFile(string writedata) 
{ 
    lock (_syncLock) 
    { 
     string path = @"C:\rfa\Example.txt"; 
     using (TextWriter tw = new StreamWriter(path, true)) 
      tw.WriteLine(writedata); 
    } 
} 

これは結果であり、数字が順番に並んでいないことに注意してください。

+0

私は推奨されたオプションを試しましたが、同じエラーが表示されました。 – NewLearner

+0

@NewLearner 。 –

+0

@NewLearner proofの編集を参照してください –

関連する問題