【问题标题】:FindFirstFile and "." / ".." record attributesFindFirstFile 和“.” /“..”记录属性
【发布时间】:2013-11-20 09:01:00
【问题描述】:

FindFirstFile 返回的点/双点文件记录的元数据是什么对象?

在实践中,它们似乎表现为软链接和硬链接的奇怪混合。在我的系统上,文件属性(例如只读/隐藏/存档标志)确实反映了它们指向的目标的状态,但是创建/写入/访问访问字段似乎总是等于被搜索目录的创建时间。

我问是因为我正在开发的构建工具决定通过首先将文件名转换为绝对文件名并归档元数据来缓存搜索结果,当后续目录的创建时间不匹配时会导致构建损坏。

我可以依靠“。”的 ftCreationTime 吗?等于文件夹本身的创建时间?这将有助于避免不必要的查询。

为了记录,这里是一个快速而肮脏的再现:

#include <stdio.h>
#include <windows.h>

static void print(const WIN32_FIND_DATAA *data) {
    printf("name=%s attrib=%08lX creation=%08lX%08lX\n", data->cFileName, data->dwFileAttributes,
        data->ftCreationTime.dwHighDateTime, data->ftCreationTime.dwLowDateTime);
}

int main(void) {
    WIN32_FIND_DATAA data = { 0 };
    HANDLE handle = FindFirstFileA("C:\\Windows\\System\\*", &data); 
    print(&data);
    FindNextFileA(handle, &data);
    print(&data);
    FindFirstFileA("C:\\Windows", &data); 
    print(&data);
    FindFirstFileA("C:\\Windows\\System", &data); 
    print(&data);
    return 0;
}

【问题讨论】:

  • 我认为您需要的信息可能是 FindFirstFile 和相关函数的结果并不总是保证是最新的,因为出于性能原因,它们可能会从缓存信息中检索到目录到文件的链接,而不是通过查询文件本身。如果您必须拥有准确和最新的信息,请改用GetFileInformationByHandle
  • Harry:真可惜,实际上在大型项目中打开和查询每个文件的日期会为大型增量构建增加几秒钟的时间。我不认为这是这里的问题,因为 Windows 文件夹的日期在我的一个系统上 5 年后没有传播到 Windows\System 中的“..”链接。

标签: windows winapi filesystems


【解决方案1】:

来自MSDN

在路径中使用句点作为目录组件来表示当前目录...

在路径中使用两个连续的句点(..)作为目录组件来表示当前目录的父级

这意味着. 当前目录,你可以相信它们的属性是相同的。但无论如何我不明白你为什么不能忽略 dotdotdot 文件。

【讨论】:

  • 这也是我最初的想法,不幸的是我在实践中没有收到相同的信息。例如,在上面的示例中,当直接查询 C:\Windows 时,我得到的 ftCreationTime 为 0x01CD6AF0D0D47552(根据资源管理器是正确的),但在迭代 C:\Windows\System* 时,“..”的 ftCreationTime 为 0x01CD6B06780841A1。我当然可以去掉“。”和“..”记录,它只是意味着必须执行一些额外的 FindFirstFile 查询。老实说,我主要只是想知道发生了什么。
  • @doynax,我刚刚检查过了。它们在 2 个系统上是相同的。你确定你做的事情正确吗?那个文件系统是什么?
  • @donyx,您可能依赖于. 的属性,但如果我们谈论的是.. 文件,您需要额外调用 FileFirstFile(或 GetFileAttributesEx)来获取父级的创建时间。
  • 我刚刚测试了 Windows 7 和 XP 系统,它们的行为似乎相似。作为记录,他的源代码和可执行文件:sites.google.com/site/doynax/FindFirstFileRepro.zip
  • @doynax:您确实应该在遍历文件系统时忽略... 项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多