2017-11-22 7 views
-2

私のコードはかなり簡単です。それは、テキストファイルにデータを書き込むためのStringBuilderとFileStreamを使用して、[オプションとして]表示用にテキストファイルが開きます:ストリームがファイルに書き込むのを待ってから読み込みます。

public async Task ExportData(data) 
{ 
    var sb = new StringBuilder(); 
    sb.AppendLine(BuildStringFromData()); 

    var dir = [email protected]"C:\Ortund\xExports\{DateTime.Now.Date.ToString 
     ("yyyy-MM-dd", CultureInfo.InvariantCulture)}"; 
    var fullPath = [email protected]"{dir}\{filename}.txt"; 

    var stream = new FileStream(fullPath, FileMode.CreateNew, FileAccess.ReadWrite); 

    var bytes = Encoding.UTF8.GetBytes(sb.ToString()); 
    await stream.WriteAsync(bytes, 0, bytes.Length); 

    if (MessageBox.Show("Open the file?", "Open?", MessageBoxButton.YesNo) 
     == MessageBoxResult.Yes) 
    { 
     System.Diagnostics.Process.Start(fullPath); 
    } 
} 

を私はこれが、この特定の実行を一時停止するだろうと考え、ファイルストリームに書き込みを待っていましたメソッドは、すべてのバイトが書き込まれるまで起こっていません。

何が起こっているのかは、ファイルを開くためのプロンプトがすぐに表示され、開いたときにその空白が表示されることです。 Notepad ++は数秒後にファイルに変更が加えられたことを通知し、エクスポートしたデータが表示されたときにリロードするかどうかを尋ねます。

ファイルデータが完全に書き込まれるまで実行を待機させてから、ユーザーにファイルを開くように要求するにはどうすればよいですか?

+0

'WriteAsync()'の代わりに 'Write()'メソッドを呼び出します。 –

+0

@MichałTurczyn私はそれを最初に試みた。ふつうは違う – Ortund

+0

次に、ストリームを閉じる必要があります... –

答えて

0

@Evkによって質問にコメントごとに、私はusingブロックにFileStreamをを入れて、私はまた、データを取る新しいメソッドに移動するとして、私は...この1に

を明らかに見落としファイルパスをパラメータとして指定します。

private async Task WriteDataToFile(List<ViewModel> data, string path) 
{ 
    using (var fs = new FileStream(path, FileMode.CreateNew, FileAccess.ReadWrite)) 
    { 
     var sb = new StringBuilder(); 
     // Loop through the data and build the string. 

     var bytes = Encoding.UTF8.GetBytes(sb.ToString()); 
     await fs.WriteAsync(bytes, 0, bytes.Length); 
    } 
} 

私が見落としたFileStreamを使用して閉じます。