2017-08-22 20 views
-1

以下に含まれているコードは、正常にCSVファイルに書き込みます。しかし、私が書き込んでいるCSVファイルがExcelで開かれた場合、「ファイルが別のプロセスによって使用されている」ことを示すSystem.IO.Exceptionが表示されます。"別のプロセスで使用中のファイル"を避けるIO例外

プログラムを実行して、CSVがExcelで開かなくなるまで待つようにコードを変更するにはどうすればよいですか?

private void timer1_Tick(object sender, EventArgs e) 
    { 
     int actmonth, actyear, actsecond; 
     System.DateTime fecha = System.DateTime.Now; 
     actmonth = fecha.Month; 
     actyear = fecha.Year; 
     if (actmonth <= 9) 
     { 
      valorfechaact = System.Convert.ToString(actyear) + "00" + System.Convert.ToString(actmonth); 
     } 
     else 
     { 
      valorfechaact = System.Convert.ToString(actyear) + "0" + System.Convert.ToString(actmonth); 
     } 

     actsecond = fecha.Second; 

     string label; 
     label = label1.Text; 
     string at = "@"; 
     string filename = valorfechaact + ".csv"; 

     string ruta3 = System.IO.Path.Combine(at, label, filename); 
     if (Directory.Exists(label1.Text)) 
     { 
      StreamWriter wr = new StreamWriter(ruta3, true); 
      wr.WriteLine("1asd" + actsecond); 
      wr.Close(); 
      wr.Dispose(); 
     } 
     else 
     { 
      System.Console.WriteLine("no se puede escribir en el archivo"); 
      timer1.Stop(); 
     } 
    } 
+3

です。 IOエラーが発生した場合は、いつでもファイルを再度一意の名前で書き込むことができます。 –

+0

@AlexK。すぐにお返事ありがとうございます、どうすればいいですか? –

+2

その例外を試してみますか? –

答えて

1

あなたがのFileStreamでファイルを開こうとするMethodeのを書いて、ブール値のフラグを返すことができ

可能な解決策は

public static class FileInfoExtension 
{ 
    public static bool IsLocked(this FileInfo file) 
    { 
     FileStream stream = null; 
     try 
     { 
      stream = file.Open(FileMode.Open, FileAccess.Read, FileShare.None); 
     } 
     catch (IOException) 
     { 
      return true; 
     } 
     finally 
     { 
      stream?.Close(); 
     } 
     return false; 
    } 
} 

次にあなたが

var fileInfo = new FileInfo(ruta3); 
    if (!fileInfo.IsLocked()) 
    { 
     // do code 
    } 

それを使用することができています待機する非常に簡単な(そして悪い)解決策は、

while (file.IsLocked()) 
    { 
     Thread.Sleep(100); 
    } 
です

一般的にあなたのコードは不明瞭で読みにくいです。

あなたは多くの還元剤コードを持っています。 多分これGuidlineはあなたにhttps://github.com/dennisdoomen/CSharpGuidelines

を助けることができるかもしれない少し明確に解決策は、ExcelのようにExcelでのオープンがそれをロックする場合は、ファイルを上書きすることはできません

private void timer1_Tick(object sender, EventArgs e) 
    { 
     var directory = label1.Text; 
     if (!Directory.Exists(directory)) 
     { 
      Console.WriteLine("no se puede escribir en el archivo"); 
      timer1.Stop(); 
      return; 
     } 
     var now = DateTime.Now; 
     _valorfechaact = now.Month <= 9 ? $"{now.Year}00{now.Month}" : $"{now.Year}0{now.Month}"; 
     var fullname = Path.Combine("@", directory, $"{_valorfechaact}.csv"); 
     var fileInfo = new FileInfo(fullname); 
     if (fileInfo.IsLocked()) 
     { 
      Console.WriteLine($"The File {fullname} is locked!"); 
      return; 
     } 
     using (var wr = new StreamWriter(fullname, true)) 
     { 
      wr.WriteLine("1asd" + now.Second); 
     } 
    } 
1

あなたはこの質問を見てとることができます:論議されているアプローチの

Checking if an Excel Workbook is open

一つは単純にファイルにアクセスしようとすることです。例外がスローされた場合は、待ってからもう一度やり直すことができます。

ワークブックが書き込み可能になるまで待つことを本当に望むなら、それを行うことができます。 whileループを使用して(たぶんあなたはタイムアウトを追加するか、関連する場合、ユーザーがExcelでファイルを閉じる必要があることを警告します)。

FileIsLockedは、前述のポストに基づいてあなたが書いた関数であり、timeoutミリ秒は、いくつかの適切なタイムアウトです
int someLargeNumberOfIterations = 100000000; 

while(FileIsLocked(filepath) && elapsedMs < timeoutMs) { 
    Thread.SpinWait(someLargeNumberOfIterations); 

    // Set elapsed 
} 

// Write the file 

:コードで はそれはのようなものである可能性があります。

関連する問題