C# DownloadFile进程无法访问该文件,因为另一进程正在使用该文件

C# DownloadFile进程无法访问该文件,因为另一进程正在使用该文件,c#,C#,我让我的下载程序下载文件,它在大部分情况下运行良好,但经常会引发异常。例外情况是: [11:15:34 a.m.] >> [Error StartDownloadFile] An exception occurred during a WebClient request. | System.IO.IOException: The process cannot access the file 'A:\Users\user\downloads\test\file.extention' b

我让我的下载程序下载文件,它在大部分情况下运行良好,但经常会引发异常。例外情况是:

[11:15:34 a.m.] >> [Error StartDownloadFile] An exception occurred during a WebClient request. | System.IO.IOException: The process cannot access the file 'A:\Users\user\downloads\test\file.extention' because it is being used by another process.
   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost)
   at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy)
   at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access)
   at System.Net.WebClient.DownloadFile(Uri address, String fileName)
我使用的代码是:

while (true)
            {
    try
        {
            downloadUrl = new Uri(result.url);
            var fileName = dir + "\\" + escapeFilename(result.passedFileName) + ".extention";

            while (true)
            {
                using (var client = new WebClient())
                {
                    client.DownloadFile(downloadUrl, fileName);
                }

                long fileSize = new FileInfo(fileName).Length;
                if (fileSize < 1000)
                {
                    Log("[Error] " + result.passedFileName + " failed, re-downloading");
                }
                else
                {
                    break;
                }
            }
            break;
        }
        catch (Exception ex)
        {
            Log("[Error StartDownloadFile] " + ex.Message + " | " + ex.InnerException);
        }
    }
while(true)
{
尝试
{
downloadUrl=新Uri(result.url);
var fileName=dir+“\\”+转义文件名(result.passedFileName)+“.extention”;
while(true)
{
使用(var client=new WebClient())
{
client.DownloadFile(downloadUrl,文件名);
}
long fileSize=新文件信息(fileName).Length;
如果(文件大小<1000)
{
日志(“[错误]”+result.passedFileName+“失败,重新下载”);
}
其他的
{
打破
}
}
打破
}
捕获(例外情况除外)
{
日志(“[Error StartDownloadFile]”+ex.Message+“|”+ex.InnerException);
}
}

现在看看其他提出类似问题的人,他们的解决方案是使用垃圾收集或类似的方法,但由于我使用的是WebClient DownloadFile,所以我认为这是内置的。因此,我不确定是什么引发了这个异常以及如何修复它。有可能是DownloadFile()函数在操作系统//框架解锁文件之前返回。 这可以解释为什么垃圾收集似乎可以解决这个问题:它只是延迟了对文件的访问

在这种情况下,解决办法是:

for (int i=0; i<20; i++) // time out = 20*100 ms = 2 seconds
try 
{ 
  // your code accessing to the file
  i=999 ; // exit loop 
} 
catch { system.thread.threading.Sleep(100) ; }

用于(int i=0;iDid您是否试图关闭TaskManager中可能正在运行的实例?您是否正在VS中以解除Bugging模式运行?检查是否没有剩余实例,然后尝试-如果错误没有消失-重新启动计算机您是否试图将文件下载到现有文件名,并且现有文件锁阻止您进行过度加载正在使用新文件调试它?@Toumash我正在调试模式下运行,并且没有其他程序实例在运行。重新启动没有用anything@RJLohan可能,但我不这么认为,因为它下载的所有文件都应该有一个“唯一的”name我认为@RJLohan可能是正确的。您可以尝试在文件系统上使用绝对唯一的文件名来测试这一点吗?可能类似于:
var fileName=dir+“\\”+string.Format(@“{0}.extension”,Guid.NewGuid())
事实证明,1060中有两项具有相同的名称,这就是为什么它给了我例外。尽管您的回答可能会帮助其他可能有类似问题的用户