该进程无法访问该文件,因为该文件正由另一个进程使用。意外的错误

时间:2015-07-10 07:52:50

标签: c#

我正在使用c#上传使用此代码的FTP文件

while(true)
{
    if(condition == true)
    {
        Process[] proc = Process.GetProcessName("ThirdPartyApp");
        if(proc.Length <0 )
        {
            var file = Process.GetProcess().Where(pr=>pr.ProcessName == "ThirdPartyApp")
            foreach(var process in file)
            {
                process.kill(); // Third party application stopped
            }
            if(File.Exists(filename))
            {
               using (System.Net.WebClient client = new System.Net.WebClient())
               {
                 client.Credentials = new System.Net.NetworkCredential("username", "password");
                 client.UploadFile(ftpServer  + new FileInfo(filename).Name, "STOR", filename);
               }
               File.Delete(filename);
               Process.Start("ThirdPartyApp");
            }
       }
    }
}

我的程序不断运行。在指定的时间,它将文件上载到服务器。程序启动后,它会在第一次成功将文件上传到服务器,但是在另一个时间间隔,第二次,它会给出这个异常。

我不明白为什么它会在第一次循环运行时给出错误,但是为什么它会在第二次循环时给出错误。

The process cannot access the file 'E:\TYV.csv' because it is being used by another process.

删除文件后,会立即创建新文件。在第二次运行时,哪个进程正在使用该文件?这是我自己的申请吗?

为什么它第一次没有被锁定?

由于

1 个答案:

答案 0 :(得分:1)

如果文件被锁定,则不会按照注释中的建议更改循环。确保您的应用锁定文件。这可能意味着您尝试在第三方发布ts之前或在写入文件之前上传文件(这可能发生在缓冲的IO)。

如果您无权访问第三方应用程序以检查它正在做什么(并在必要时进行更改),您可以执行以下操作:

此第一个例程检查文件是否已锁定(取自此处:Is there a way to check if a file is in use?

//routine to check if the file is locked
protected virtual bool IsFileLocked(FileInfo file)
{
    FileStream stream = null;

    try
    {
        stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
    }
    catch (IOException)
    {
        //the file is unavailable because it is:
        //still being written to
        //or being processed by another thread
        //or does not exist (has already been processed)
        return true;
    }
    finally
    {
        if (stream != null)
            stream.Close();
    }

    //file is not locked
    return false;
}

public void SendFile(string filename, int maxTries)
{
    bool done;
    while(true)
    {
        if(condition == true)
        {
            if(!IsFileLocked(filename))
            {
                Process[] processes = Process.GetProcessByName("ThirdPartyApp");
                foreach (var proc in processes)
                    proc.Kill();

                using (System.Net.WebClient client = new System.Net.WebClient())
                {
                    client.Credentials = new System.Net.NetworkCredential("username", "password");
                    int count = 0;
                    done = false;
                    while (count < maxTries || !done)
                    {
                        try
                        {
                            client.UploadFile(ftpServer  + new FileInfo(filename).Name, "STOR", filename);
                            done = true;
                        }
                        catch(Exception ex)
                        {
                            System.Threading.Thread.Sleep(5000);
                            count++;
                        }
                    }
                    if (!done)
                    {
                        //handle the error
                    }
                }

                File.Delete(filename);
                Process.Start("ThirdPartyApp");
            }
        }
    }
}

如果是临时储物柜的问题,这可以帮助您解决问题。 但要注意的是,如果你在释放文件之前杀死了第三方,并且File.Exist可能会给你错误的印象,即该进程完成了它的工作,你仍然会锁定文件。

另一点是检查文件是否被锁定也可能失败,如果在检查之后“ThirdPartyApp”锁定文件并在应用程序释放之前终止应用程序。

所以,对我来说,最好的答案是使用thsi代码并尝试打开文件(自己锁定)。如果可以(没有例外),使用打开的流发送到FTP。完成后,关闭它,删除文件并再次运行ThirdApp。

编辑:添加代码以查看文件是否被锁定,只有在不删除ThirdPartyApp时才会执行其余代码。