Web から多くのファイルをダウンロードし、別のマッピング ファイルに従ってフォルダー構造に配置する非常に単純なコンソール アプリを作成しました。この要件では、ファイルを非同期でダウンロードする必要はありません。
プログラムは機能しますが、問題は、誰かが ctrl+c または ctrl+break を使用してアプリをキャンセルすることを選択した場合です。
それが行われると、プログラムが即座に終了するため、進行中のファイルが破損します。そのため、終了する前に破損したファイルを削除したかったのです。したがって、次のハンドラーを作成しました。
static void Console_CancelKeyPress(object sender, ConsoleCancelEventArgs e)
{
try
{
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("Program interrupted..deleting corrupted file");
Console.ResetColor();
if (File.Exists(fileInProgress))
{
File.Delete(fileInProgress);
}
}
catch
{
Console.WriteLine("Error occured.");
}
}
fileinprogress
ダウンロードファイルを呼び出す関数から更新されたグローバル変数です。
上記のコードの問題は、ctrl+c を押してコードを実行すると、使用中のファイルとしてファイルが削除されないことです。だから私はhttps://stackoverflow.com/a/937558/714518に従い、プログラムがファイルを解放するまで待機しようとしました
static void Console_CancelKeyPress(object sender, ConsoleCancelEventArgs e)
{
try
{
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("Program interrupted..deleting corrupted file");
Console.ResetColor();
if (File.Exists(fileInProgress))
{
while (IsFileLocked(fileInProgress))
{
System.Threading.Thread.Sleep(1000);
}
File.Delete(fileInProgress);
}
}
catch
{
Console.WriteLine("Error occured.");
}
}
今、私は行動を理解していません。ctrl+c が押された場合、プログラムは数秒待機し、ファイルを削除せずに次のファイルのダウンロードを続行します。この問題を取り除くのを手伝ってください。
実際のアプリはかなり大きく、状況を再現しただけです。完全なコードについては、 http://pastebin.com/TRBEAvwiを参照してください。