我不确定是否已经有人问过这个问题,我似乎找不到它。
当我进行文件夹内容枚举时,您知道通常的情况:
FindFirstFile();
do
{
}while(FindNextFile());
如果当我仍在
do/while
循环中时文件夹内容发生变化,会发生什么情况?比如说,添加、更改或删除新文件或文件夹。这是否反映在 FindNextFile
返回的结果中?
一个快速测试案例表明,FindFirstFile 不会将结果缓存在 Windows 7 上运行的本地文件系统上。但是,一旦调用 FindNext,结果就会被缓存(不是完全,只是一点点)。但由于 Windows SDK 中没有对此进行记录,因此必须将其视为实现细节,并且可能随时更改。因此,以不依赖于这种行为的方式编写代码。
对于我的 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();
}