进程无法访问文件,因为它被另一个进程使用

时间:2019-07-30 13:12:11

标签: c# asynchronous dispose fluentftp

所以我收到异常消息“进程无法访问文件,因为该文件已被另一个进程使用。

当我调用此特定方法时,将显示异常:

public async static Task<bool> DownloadFileFromFTP(string PathToFile, string AppName)
{
    return await Task.Run(() => {
       if (File.Exists("settings.xml"))
       {
           XmlSerializer xs = new XmlSerializer(typeof(Information));
           FileStream read = new FileStream("settings.xml", FileMode.Open, FileAccess.Read, FileShare.Read);
           Information info = (Information)xs.Deserialize(read);

           try
           {
               FtpClient client = new FtpClient(info.HDSynologyIP);
               string a = info.FtpPassword;
               string FTPPassword = EncryDecryptor.Decrypt(a);
               client.Credentials = new NetworkCredential(info.FtpUsername, FTPPassword);
               client.Connect();

               bool finish = client.DownloadFile(@info.Downloads + "\\" + AppName, PathToFile, FtpLocalExists.Overwrite, FluentFTP.FtpVerify.Retry);
               if (finish == true)
               {
                   client.Disconnect();
                   read.Close();
                   return true;
               }
               else
               {
                   client.Disconnect();
                   read.Close();
                   return false;
               }

           }
           catch (Exception ex)
           {
               MessageBox.Show(ex.ToString());
               read.Close();
           }
           read.Close();
       }
       else
       {
           MessageBox.Show("Missing settings.xml file");
           return false;
       }
       return false;
   });
}

并在另一个这样的类中调用它:

await General_Functions.DownloadFileFromFTP("Ultra_Script/Basic_SW/Adobe_Reader.exe", "Adobe_Reader.exe");   

它以前不是异步的,但是我不得不将其重新制成异步方法。但是我想我正在正确关闭读者和客户。可以是异步方法的问题吗?因为在使它异步之前,我没有这个问题。

有人可以解释我在做什么错吗?

注意,我正在使用https://github.com/robinrodricks/FluentFTP中的FluentFTP

1 个答案:

答案 0 :(得分:0)

使用using终止文件读取器进程

using(FileStream read = new FileStream("settings.xml", FileMode.Open, FileAccess.Read, FileShare.Read))
{ 
    // your code here.....
}