【发布时间】: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