0

在我的程序中,我将路径传递给一个文件,该文件可能仍在被另一个进程(独立的外部非 c#)写入。

在将路径实际发送回客户端之前,如何检查文件是否完全可读和可访问?FileIOPermission with Demand for reading 对我不起作用,所以我想知道是否有其他方法可以在不尝试预先读取整个文件的情况下执行此操作。

谢谢你。

4

5 回答 5

7

检查文件是否可访问和完全可读,然后打开文件进行读取的麻烦在于,状态可能会检查和您实际想要对其进行操作的打开之间发生变化。

我的建议是继续打开文件进行阅读,如果出现问题,请确保捕获适当的异常。然后,您可以稍等片刻再试一次,或执行其他操作。

请记住,仅仅因为你的程序有一系列对来说是合乎逻辑的事件,操作系统中正在发生许多事情,并且状态可以很容易地在两行代码之间改变,这对你来说似乎是无懈可击的,但它们之间有一个时代多任务水平。

于 2013-09-20T13:07:37.880 回答
3

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;
  }
于 2013-09-20T14:07:09.820 回答
1

最好的方法是在正常的 try catch 块中读取文件,然后根据是否引发异常应用逻辑继续与否。

此外,第二种方法是检查文件是否不是零大小,而纯粹作为辅助检查。

于 2013-09-20T13:14:44.797 回答
0

创建一个循环并尝试打开文件
如果发生异常使您的线程休眠几秒钟
并重复该过程

于 2013-09-20T13:09:42.913 回答
0

外部进程完成后,是否关闭?如果是这样,您可以修改此处找到的解决方案。它看起来像下面这样:

//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);

这两种方法还应该添加某种计数,以确保它们最终停止尝试并出错,否则您可能会陷入无限循环。

于 2013-09-20T13:31:59.577 回答