gpt4 book ai didi

c++ - 调用 ReadDirectoryChangesW 时,只有第一次调用返回任何更改(同步和异步)

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:35:51 26 4
gpt4 key购买 nike

以下是使用 ReadDirectoryChangesW 的最小程序。我遇到的问题是只有第一次调用 GetQueuedCompletionStatus 返回。第二次通过循环,无论对目录进行多少更改,它都会永远阻塞。

我也尝试过使用同步版本,但遇到了完全相同的问题。

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

int main() {
// Open the directory to monitor.
HANDLE dir = ::CreateFileA(
"G:\\Program Files (x86)\\Steam\\steamapps\\common\\eve online"
, FILE_LIST_DIRECTORY
, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE
, NULL
, OPEN_EXISTING
, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED
, NULL
);

if (dir == INVALID_HANDLE_VALUE) {
std::cout << "Failed to open directory for change notifications!\n";
return 1;
}

// Setup IOCP.
HANDLE iocp = ::CreateIoCompletionPort(
dir
, NULL
, NULL
, 1
);

// Monitor.
while (true) {
std::array<char, 1024 * 8> buf;
DWORD bytes_read;
OVERLAPPED overlapped;
std::memset(&overlapped, 0, sizeof(overlapped));
BOOL result = ::ReadDirectoryChangesW(
dir
, &buf.front()
, buf.size()
, false
, FILE_NOTIFY_CHANGE_FILE_NAME // Includes file creation.
, &bytes_read
, &overlapped
, NULL
);

if (result == FALSE) {
DWORD error = ::GetLastError();
std::cout << "Call to ReadDirectoryChangesW failed! " << error << "\n";
return 1;
}

// Wait for completion.
ULONG_PTR key;
LPOVERLAPPED overlapped_result;

result = ::GetQueuedCompletionStatus(
iocp
, &bytes_read
, &key
, &overlapped_result
, INFINITE
);

if (result == FALSE) {
std::cout << "Call to GetQueuedCompletionStatus failed!\n";
return 1;
}

// Print results!
for (FILE_NOTIFY_INFORMATION *fni =
reinterpret_cast<FILE_NOTIFY_INFORMATION *>(&buf.front());
;
fni = reinterpret_cast<FILE_NOTIFY_INFORMATION *>(
reinterpret_cast<char *>(fni) + fni->NextEntryOffset)) {
std::wstring filename(fni->FileName, fni->FileName + fni->FileNameLength);
std::wcout << "Got change: " << filename.c_str() << "\n";

if (fni->NextEntryOffset == 0) break;
}
}

}

最佳答案

一些问题。

首先,您尝试将多字节字符串文字输出到 wcout。您应该通过在 L 之前将它们变成宽字符串。

其次,FileNameLength 变量表示名称的字节长度,而不是字符长度。您应该将它除以 2 以获得字符数。

关于c++ - 调用 ReadDirectoryChangesW 时,只有第一次调用返回任何更改(同步和异步),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6851339/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com