FindFirstFile/FindNextFile API 对缓存结果是否返回?

问题描述 投票:0回答:2

我不确定是否已经有人问过这个问题,我似乎找不到它。

当我进行文件夹内容枚举时,您知道通常的情况:

FindFirstFile();
do
{
}while(FindNextFile());

如果当我仍在

do/while
循环中时文件夹内容发生变化,会发生什么情况?比如说,添加、更改或删除新文件或文件夹。这是否反映在
FindNextFile
返回的结果中?

c++ windows winapi
2个回答
4
投票

一个快速测试案例表明,FindFirstFile 不会将结果缓存在 Windows 7 上运行的本地文件系统上。但是,一旦调用 FindNext,结果就会被缓存(不是完全,只是一点点)。但由于 Windows SDK 中没有对此进行记录,因此必须将其视为实现细节,并且可能随时更改。因此,以不依赖于这种行为的方式编写代码。


0
投票

对于我的 Windows 11 PC,Windows 无法获取快照并注意到目录更新,但可能不可靠。

#include <Windows.h>
#include <iostream>

using namespace std;

int main()
{
    constexpr wchar_t const *FILENAME = L"file.bin";
    DeleteFileW( FILENAME );
    WIN32_FIND_DATAW fdw;
    HANDLE hFind = FindFirstFileW( L"*", &fdw );
    auto ret = [] { return GetLastError() == ERROR_FILE_NOT_FOUND ? EXIT_SUCCESS : EXIT_FAILURE; };
    if( hFind == INVALID_HANDLE_VALUE )
        return ret();
    HANDLE hFile = CreateFileW( FILENAME, GENERIC_READ | GENERIC_WRITE, 0, nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
    if( hFile == INVALID_HANDLE_VALUE )
        return EXIT_FAILURE;
    do
        wcout << fdw.cFileName << endl;
    while( FindNextFileW( hFind, &fdw ) );
    return ret();
}
© www.soinside.com 2019 - 2024. All rights reserved.