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

时间:2013-09-20 13:00:15

标签: c# .net

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

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

谢谢。

5 个答案:

答案 0 :(得分:7)

检查文件是否可访问且完全可读并且然后打开文件以进行读取的问题可能是,状态可能会在检查之间发生并打开你真正希望用它做的事情。

我的建议是继续打开文件进行阅读,确保在出现问题时捕获相应的异常。然后,您可以稍等一会儿再试一次,或者做其他事情。

请记住,仅仅因为你的程序有一系列对逻辑的事件,操作系统中会发生很多事情,并且状态可以很容易地在看似不漏的两行代码之间进行更改对你而言,但在多任务处理级别之间有一个时代。

答案 1 :(得分: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;
  }

答案 2 :(得分:1)

最好的方法是在普通的try catch块中读取文件,然后根据是否抛出异常来应用逻辑继续与否。

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

外部流程完成后,它会关闭吗?如果是这样,您可以修改找到的解决方案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);

这两种方法都应该添加某种计数,以确保它们最终停止尝试和错误输出,否则你最终可能会出现无限循环。