Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从网站下载多个文件,如何处理ctrl+;c正确_C#_.net_Visual Studio 2010_Console Application - Fatal编程技术网

C# 从网站下载多个文件,如何处理ctrl+;c正确

C# 从网站下载多个文件,如何处理ctrl+;c正确,c#,.net,visual-studio-2010,console-application,C#,.net,Visual Studio 2010,Console Application,我已经创建了一个非常简单的控制台应用程序,它可以从web下载很多文件,并将它们放在一个单独的映射文件之后的文件夹结构中。该要求不要求文件需要异步下载 该程序可以运行,但问题是如果有人选择使用ctrl+c或ctrl+break取消应用程序 如果这样做,正在进行的文件将随着程序立即退出而损坏。所以我想在退出之前删除损坏的文件。因此,我编写了以下处理程序 static void Console_CancelKeyPress(object sender, ConsoleCancelEventArgs e

我已经创建了一个非常简单的控制台应用程序,它可以从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,它将执行代码,但不会删除正在使用的文件。因此,我跟随并尝试等待,直到程序释放该文件

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,程序将等待几秒钟,然后在不删除文件的情况下继续下载下一个文件。请帮忙解决这个问题


实际的应用程序相当大,我只是重新创建了这种情况。有关完整代码,请参阅。

听起来您需要一种方法来向下载代码发出停止下载的信号。从这个示例来看,我认为最好的位置可能是进入您的Console\u CancelKeyPress功能。否则,您的下载代码将永远不会意识到它需要释放文件锁并停止下载

例如:

static void Console_CancelKeyPress(object sender, ConsoleCancelEventArgs e)
{
    try
    {
        Interlocked.Increment(ref globalStopFlag);

        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.");
    }
}

void SomeDownloadFunction()
{
   using (somefile)
   {
     while (!downloadFinished)
    {
        long doINeedToStop = Interlocked.Read(ref   globalStopFlag)

        if (doINeedToStop != 0)
          return;

        //Download the next set of packets and write them to somefile
    }
   }
}

您的代码提供了停止下一次下载的方法。在下载完成之前,文件似乎已锁定。在这种情况下,我不需要删除该文件,下载当前文件后,下载将中止。:)