【发布时间】:2013-09-20 13:00:14
【问题描述】:
在我的程序中,我将路径传递给可能仍在被另一个进程(独立外部非 c#)写入的文件。
在将路径实际发送回客户端之前,如何检查文件是否完全可读和可访问? FileIOPermission with Demand for reading 对我不起作用,所以我想知道是否有其他方法可以在不尝试预先读取整个文件的情况下执行此操作。
谢谢。
【问题讨论】:
在我的程序中,我将路径传递给可能仍在被另一个进程(独立外部非 c#)写入的文件。
在将路径实际发送回客户端之前,如何检查文件是否完全可读和可访问? FileIOPermission with Demand for reading 对我不起作用,所以我想知道是否有其他方法可以在不尝试预先读取整个文件的情况下执行此操作。
谢谢。
【问题讨论】:
检查文件是否可访问和完全可读的问题,然后打开文件进行读取是潜在的,状态可能会改变在检查之间以及你真正想用它做某事的开放空间。
我的建议是继续打开文件进行阅读,确保在出现问题时捕获相应的异常。然后,您可以稍等片刻再试一次,或执行其他操作。
请记住,仅仅因为你的程序有一系列对你来说合乎逻辑的事件,操作系统中正在发生许多事情,并且状态可以很容易地在看起来无懈可击的两行代码之间改变对你来说,但在多任务处理级别之间有一个时代。
【讨论】:
Moo-Juice 是对的。您无法检查文件是否可以成功读取然后打开它进行阅读......事情可能会发生变化,无论如何您都可能会遇到异常。最好只是阅读它并捕获异常。
public bool TryReadFile(String path, out String contentsOfFile)
{
try
{
// Try reading file
contentsOfFile = File.ReadAllText(path);
// Success! Yay!
return true;
}
catch (IOException)
{
// Oops! Can't read that file!
// Return some default value and let the caller know we failed
contentsOfFile = String.Empty;
return false;
}
【讨论】:
最好的方法是在正常的 try catch 块中读取文件,然后根据是否引发异常应用逻辑继续与否。
另外,次要的方法是检查文件大小是否不为零,而纯粹作为次要检查。
【讨论】:
创建一个循环并尝试打开文件
如果发生异常,请让您的线程休眠几秒钟
并重复这个过程
【讨论】:
外部进程完成后,是否关闭?如果是这样,您可以修改找到的解决方案 here。它看起来像下面这样:
//While the process is found running
while (System.Diagnostics.Process.GetProcessesByName(process).Length != 0)
{
//Sleep for three seconds
System.Threading.Thread.Sleep(3000);
}
//open file for reading
但是,如果该过程在完成后没有关闭,则上述方法将不起作用。您可以尝试将以下内容放在一个尝试以独占方式打开文件的循环中,直到它成功:
System.IO.File.Open(PathToFile, FileMode.Open, FileAccess.Read, FileShare.None);
这两种方法还应该添加某种计数,以确保它们最终停止尝试并出错,否则您可能会陷入无限循环。
【讨论】: