2017-10-10 20 views
0

私はMicrosoftが、私はこれを使用してに実行しています問題は、ファイルのコピーが終了したら、それは日付変更された値を保持していないということです問題非同期

https://docs.microsoft.com/en-us/dotnet/standard/io/asynchronous-file-i-oを提供する記事とは非同期にファイルをコピーしていますし、ファイルが作成された時刻に設定されます。

これを補うために、私はFile.SetLastWriteTime静的メソッドでコピーを完了した後、各ファイルの日付変更時刻を設定しようとしています。

foreach (var file in dir.EnumerateFiles()) 
{ 
    string temppath = Path.Combine(destDirName, file.Name); 
    using (FileStream reader = new FileStream(file.FullName, FileMode.Open, FileAccess.Read)) 
    { 
     using (FileStream writer = new FileStream(temppath, FileMode.Create, FileAccess.ReadWrite)) 
     { 
      await reader.CopyToAsync(writer); 
      File.SetLastWriteTime(temppath, file.LastWriteTime); 
     } 
    } 
} 

残念ながら、await reader.CopyToAsync(writer)が終了する前にFile.SetLastWriteTime方法がすぐに実行されるようです。

reader.CopyToAsyncが終了するまで、File.SetLastWriteTimeメソッドが実行されないようにするにはどうすればよいですか?

Task.Runの中でメソッドを同期的にコピーするように変更すると、意図したとおりに動作しているようですが、それが正しい方法であるかどうかはわかりません。

+1

"残念ながら、File.SetLastWriteTimeメソッドは、reader.CopyToAsync(writer)が待機する直前に実行されるようです。"本気ですか?あなたはそれを言うためにどのようなシステムのふるまいを経験していますか? –

+0

_ "File.SetLastWriteTimeメソッドがreader.CopyToAsyncが終了するまで実行されないようにするにはどうすればよいですか?"だから問題がある場合は、あなたが投稿しなかったコードにある可能性が高いです。あなたの質問には、問題を確実に再現する良い[mcve]が含まれている必要があります。あるいは、 'File.Copy()'メソッド( 'Task.Run()'を使って非同期動作をさせる)を試してみてください。 –

+0

別のプロセスで使用されていたため、ファイルに時刻を設定できないというメッセージが表示されます。 – Ambidex

答えて

1

私はそれを理解することができました。

ファイルの時刻を設定できなかったのは、まだストリーム内にあったからです。

単純に書き込みストリームの外にメソッドを移動し、問題を解決しました。

 foreach (var file in dir.EnumerateFiles()) 
     { 
      string temppath = Path.Combine(destDirName, file.Name); 
      using (FileStream reader = new FileStream(file.FullName, FileMode.Open, FileAccess.Read)) 
      { 
       using (FileStream writer = new FileStream(temppath, FileMode.Create, FileAccess.ReadWrite)) 
       { 
        await reader.CopyToAsync(writer); 

       } 
       File.SetLastWriteTime(temppath, file.LastWriteTime); 
      } 
     }