如何检查文件是否可以成功读取

本文关键字:是否 成功 读取 文件 何检查 检查 | 更新日期: 2023-09-27 18:32:19

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

实际将路径发送回客户端之前,如何检查文件是否完全可读和可访问?具有读取需求的FileIOPermission对我不起作用,所以我想知道是否有其他方法可以在不尝试预先读取整个文件的情况下做到这一点。

谢谢。

如何检查文件是否可以成功读取

检查文件是否可访问且完全可读,然后打开文件进行读取的麻烦在于,状态可能会在检查和打开之间发生变化,您实际上想要对它做一些事情。

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

请记住,仅仅因为你的程序有一系列对你来说合乎逻辑的事件,操作系统中就会发生很多事情,并且状态可以很容易地在两行代码之间切换,这些代码对来说似乎是无懈可击的,但在多任务级别它们之间有一个纪元。

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 块中读取文件,然后根据是否引发异常来应用逻辑以继续或不继续。

此外,次要方法是检查文件的大小是否为零,而是纯粹作为辅助检查。

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

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

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

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