我对 ReadDirectoryChangesW 失败并出现错误 995 的奇怪行为感到困惑。场景解释如下。
FileHandle 是使用 CreateFileW 获得的。
在步骤 1 中获得的 FileHandle 用于 ReadDirectoryChangesW。它成功并将请求发送到服务器
轮询 10 秒,如果服务器没有生成更改通知,则使用 cancelIo 取消 chnagenotify 请求。它发送取消和服务器响应。
现在再次使用在步骤 1 中获得的文件句柄通过 ReadDirectoryChangesW 设置更改通知,它失败并显示“995 - 由于线程退出或应用程序请求,I/O 操作已中止”。此步骤未向服务器发送实际请求。
立即使用在步骤 1 中获得的文件句柄再次调用 ReadDirectoryChangesW 并成功并向服务器发送请求。
步骤 3、4、5 在循环中重复,每个备用的 ReadDirectoryChangesW 都会失败,并返回 995,并且下一个会立即成功。
谁能告诉我发生了什么事?下面是代码
void setnotify(WCHAR* _path)
{
OVERLAPPED _overlapped;
HANDLE _handle;
char _buffer[8192] = {0};
DWORD _bufferSize = 8192;
CnState _state = CN_READY;
DWORD _inactivityTime = 0;
typedef enum State
{
CN_READY,
CN_REQUEST_PENDING,
CN_RESPONSE_RECEIVED,
CN_REQUEST_CANCELLED
} CnState;
_handle = CreateFileW(_path,
GENERIC_READ, // access
FILE_SHARE_READ |
FILE_SHARE_WRITE |
FILE_SHARE_DELETE, // share
NULL, // sec
OPEN_EXISTING, // disp
FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED, // flags
0);
if (_handle == INVALID_HANDLE_VALUE)
{
exit(-1);
}
memset(&_overlapped, 0, sizeof(OVERLAPPED));
if (!ReadDirectoryChangesW(_handle,
_buffer,
_bufferSize,
true,
0x255,
NULL,
&_overlapped,
NULL)) {
exit(-1);
} else {
_state = CN_REQUEST_PENDING;
wprintf(L"Sent Change notify to Server\n");
}
while (1)
{
if ((_state == CN_REQUEST_PENDING) && (HasOverlappedIoCompleted(&_overlapped))) {
wprintf(L"Response Received from Server\n");
_state = CN_RESPONSE_RECEIVED;
}
if ((_state == CN_RESPONSE_RECEIVED) || (_state == CN_REQUEST_CANCELLED)) {
memset(&_overlapped, 0, sizeof(OVERLAPPED));
_inactivityTime = 0;
if (!ReadDirectoryChangesW(_handle,
_buffer,
_bufferSize,
true,
255,
NULL,
&_overlapped,
NULL)) {
wprintf(L"Sent Change notify to Server Failed.\n");
} else {
wprintf(L"Sent Change notify to Server\n");
_state = CN_REQUEST_PENDING;
}
}
if ((_state == ChangeNotifyRequest::CN_REQUEST_PENDING) &&
(_inactivityTime >= 5000)){
if (CancelIo(_handle)) {
_state = CN_REQUEST_CANCELLED;
wprintf(L"Cancelled Pending Requests.\n");
} else {
wprintf(L"Cancelled failed");
}
}
Sleep(50);
_inactivityTime += 50;
}
}
以下是示例 O/P:
向服务器发送更改通知
已取消的待处理请求。
向服务器发送更改通知
已取消的待处理请求。
向服务器发送更改通知失败。
向服务器发送更改通知
已取消的待处理请求。
向服务器发送更改通知失败。
向服务器发送更改通知
已取消的待处理请求。
向服务器发送更改通知失败。
向服务器发送更改通知