0

概述:

我有一个问题,即一百台 PC 中的一台刚开始遇到 LibTiff 库问题,不想打开我的任何 tiff 图像。我怀疑它与已更改的依赖文件有关。我以前见过这个问题,但不记得我是如何解决这个问题的(我想我用另一台工作的 PC 上的一些 dll 文件替换了一些 dll 文件)。我尝试使用 Dependency Walker 来确定 LibTiff.Net dll 使用了哪些文件,但无法让 Dependency Walker 工作,它只是在打开一堆 dll 时出错。

问题:

是否有可能知道为什么文件没有被成功打开?所有方法都是返回 NULL,有没有办法得到某种类型的错误?我知道文件没有锁定(重新启动,并检查了其他方式)。我知道 tiff 文件很好,没有问题(将它们复制到另一台使用相同软件的 PC 上,它读取得很好)。我可以使用“GetLastError”之类的东西来返回 Open 方法返回 Null 的原因吗?

这是我目前的用法:

using BitMiracle.LibTiff.Classic;

using (Tiff tImage = Tiff.Open(sFileName, "r"))
{
    if (tImage == null)
    {
      //File could not be opened
      lastError = "File could not be opened.";
      return null;
    }
}
4

1 回答 1

0

移动成为我评论的答案:

可以确定,但是您需要单独进行检查,因为Tiff.Open不会引发异常。它要么打开文件,要么返回 null。

我会添加一个if(!File.Exists(sFileName)) throw new FileNotFoundException("File was not found.", sFileName);. 这将是一个重要的问题,因为如果文件存储在网络驱动器上并且该驱动器暂时不可用,则可能会发生这种情况。

另请参阅此问题/答案以检查文件是否已锁定。这将是它可能无法打开文件的另一个重要原因。如果图像文件被您的代码或其他应用程序打开并且资源未释放,它将保持锁定状态。以下是链接讨论中的代码:

protected virtual bool IsFileLocked(FileInfo file)
{
    FileStream stream = null;

    try
    {
        stream = file.Open(FileMode.Open, FileAccess.Read, 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;
}

一般来说,您应该在尝试打开它之前进行自己的检查;或者您可以尝试打开它并检查它是否返回null,然后您可以进行检查。这完全取决于您,因为它不会抛出自己的异常。

于 2016-01-26T13:26:39.270 回答