Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winapi 如何在WIN32 API中的ReadDirectoryChange中只刷新一次?_Winapi_Loops_Refresh - Fatal编程技术网

Winapi 如何在WIN32 API中的ReadDirectoryChange中只刷新一次?

Winapi 如何在WIN32 API中的ReadDirectoryChange中只刷新一次?,winapi,loops,refresh,Winapi,Loops,Refresh,我在WIN32 API中使用了ReadDirectoryChange。复制10个文件夹后,我的程序将运行刷新10次。但是我只想刷新一次。 你能帮助我吗?这是我的密码: bool FolderWatcher::Loop () { // declare a variable and using it to return int i = 0; // convert from WCHAR to LPWSTR LPWSTR ptr = _folder; char b

我在WIN32 API中使用了
ReadDirectoryChange
。复制10个文件夹后,我的程序将运行刷新10次。但是我只想刷新一次。 你能帮助我吗?这是我的密码:

bool FolderWatcher::Loop ()
{
    // declare a variable and using it to return
    int i = 0;
    // convert from WCHAR to LPWSTR
    LPWSTR ptr = _folder;
    char buf[256 * (sizeof(FILE_NOTIFY_INFORMATION) + MAX_PATH * sizeof(WCHAR))] = {0};
    DWORD bytesReturned = 0;
    BOOL result = FALSE;
    FILE_NOTIFY_INFORMATION *fni = NULL;
    // using CreateFile to choose folder need to watch
    HANDLE hDir = CreateFileW( 
        ptr,
        FILE_LIST_DIRECTORY | 
        STANDARD_RIGHTS_READ,
        //Enables subsequent open operations on a file or device to request read access.
        FILE_SHARE_READ | 
        //Enables subsequent open operations on a file or device to request write access.
        FILE_SHARE_WRITE | 
        //Enables subsequent open operations on a file or device to request delete access.
        FILE_SHARE_DELETE,
    NULL,
    //Opens a file or device, only if it exists.
    OPEN_EXISTING,
    FILE_FLAG_BACKUP_SEMANTICS,
    NULL);
    // check if directory is not exists
    if (!hDir || hDir == INVALID_HANDLE_VALUE)
    {
        i = 0;
    }
    else
    {
        for (;;)
        {
            // call ReadDirectoryChangeW to watch folder
            result = ReadDirectoryChangesW(hDir,
            buf,
            sizeof(buf) / sizeof(*buf),
            FALSE, /* monitor the entire subtree */
                FILE_NOTIFY_CHANGE_FILE_NAME |
                FILE_NOTIFY_CHANGE_DIR_NAME |
                FILE_NOTIFY_CHANGE_ATTRIBUTES |
                FILE_NOTIFY_CHANGE_SIZE | 
                /*FILE_NOTIFY_CHANGE_LAST_WRITE | 
                FILE_NOTIFY_CHANGE_LAST_ACCESS |*/
                FILE_NOTIFY_CHANGE_CREATION |
                FILE_NOTIFY_CHANGE_SECURITY,
            &bytesReturned,
            NULL,
            NULL);
                if (result && bytesReturned)
                {
                    wchar_t filename[MAX_PATH];
                    wchar_t action[256];
                    for (fni = (FILE_NOTIFY_INFORMATION*)buf; fni; )
                    {
                        switch (fni->Action)
                        {
                             // excute if a folder/ text docu is added
                            case FILE_ACTION_ADDED:
                            {
                                i = 1;
                                PostMessage (_hwndNotifySink, WM_FOLDER_CHANGE, 0, (LPARAM) _folder);
                            }
                                break;
                            // excute if a folder/ text docu is removed
                            case FILE_ACTION_REMOVED:
                            {
                                i = 1;
                                PostMessage (_hwndNotifySink, WM_FOLDER_CHANGE, 0, (LPARAM) _folder);
                            }
                                break;
                            case FILE_ACTION_MODIFIED:
                            {
                                i = 1;
                                if(lstrcmp(fni->FileName, L"service.log") != 0)
                                PostMessage (_hwndNotifySink, WM_FOLDER_CHANGE, 0, (LPARAM) _folder);
                                break;
                            }
                            // excute if a folder/ text docu is renamed
                            case FILE_ACTION_RENAMED_OLD_NAME:
                            {
                                i = 1;
                                PostMessage (_hwndNotifySink, WM_FOLDER_CHANGE, 0, (LPARAM) _folder);
                                break;
                            }
                            // excute if a folder/ text docu is renamed new name
                            case FILE_ACTION_RENAMED_NEW_NAME:
                            {
                                i = 1;
                                PostMessage (_hwndNotifySink, WM_FOLDER_CHANGE, 0, (LPARAM) _folder);
                            }
                                break;
                        }
                    if (fni->NextEntryOffset)
                    {
                        char *p = (char*)fni;
                        fni = (FILE_NOTIFY_INFORMATION*)(p + fni->NextEntryOffset);
                    }
                    else
                    {
                        fni = NULL;
                    }
                }
            }
            else
            {
                i = 0;
            }
        }   
    CloseHandle(hDir); // close handle
    }
    return i; // return value of i
    }

如果
WM\u FOLDER\u CHANGE
,我会调用刷新功能。

它是在收到消息时运行此功能10次,还是在复制10个文件时调用消息10次?我想接收一次消息。现在我收到了10次。我想我必须在别的地方写“PostMessage”。但我不知道know@MinhHuong Nguyen对于(;;)有一个无限循环。我看不出你是如何退出循环的。所有break语句都在switch语句中。这是你的真实密码吗?是的。这是无限循环。我总是想抓住机会