4

从 QFileInfo 文档运行此示例代码时:

 QFileInfo fi("/tmp/archive.tar.gz");
 QString base = fi.baseName();  // base = "archive"

它会导致访问文件系统吗?

我假设调用fi.lastModified()fi.exists()需要访问文件系统,但是我只使用它来提取文件名的一部分(扩展名、基本文件名、仅目录等)呢?

4

2 回答 2

6

如果不查看方法的实现,很难准确地说出哪种方法访问文件系统,哪种方法不访问。但我在图书馆找到了回答你问题的这种解释:

性能问题

的一些QFileInfo函数查询文件系统,但出于性能原因,一些函数只对文件名本身进行操作。例如:要返回一个相对文件名的绝对路径,absolutePath()必须查询文件系统。但是,该 path()函数可以直接处理文件名,因此速度更快。

注意:为了提高性能,QFileInfo缓存有关文件的信息。因为文件可以被其他用户或程序更改,甚至可以被同一程序的其他部分更改,所以有一个刷新文件信息的功能:refresh(). 如果您想关闭 aQFileInfo的缓存并在每次向它请求信息时强制它访问文件系统,请调用 setCaching(false).

于 2012-12-05T14:17:04.130 回答
2

我有同样的问题,所以我研究了 Qt 源代码。确切地说是 462 版。此外,我的重点特别QFileInfo是采用 a 的构造函数QString(如原始问题代码所示)。

此构造函数调用QAbstractFileEngine::create它本身进行 2 次明显调用:

  1. QDir::searchPaths()
  2. new QFSFileEngine()

鉴于我对这两个操作的理解,我相当有信心此构造函数不会访问文件系统,而是准备QFileInfo使用本机环境中提供的文件名执行此类操作(文件路径约定,如 Unix 与 MS-DOS )。

需要考虑的一件事是,此声明/代码随时可能更改。因此,除非 Qt 的文档直接指出它不访问文件系统,否则我的回答不会永远正确。

于 2017-06-23T02:04:23.147 回答