我正在使用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.
删除文件后,会立即创建新文件。在第二次运行时,哪个进程正在使用该文件?这是我自己的申请吗?
为什么它第一次没有被锁定?
由于
答案 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时才会执行其余代码。