C ++ / CLI: FileSystemWatcher перемещает или копирует не пустую папку

0

Я работаю с FileSystemWatcher в C++/CLI. У меня возникли проблемы с перемещением или копированием непустой папки: при копировании папки с одним.txt файлом в нее в смотрящую папку, возникают несколько created и changed событий, это прекрасно, но когда я перемещаю одну и ту же папку, создается только одно событие создания для папки. Проблема в том, что мне нужно знать, что в ней есть файлы ведьмы, поэтому моя идея состояла в том, чтобы просто создать цикл в changed событии, которое рекурсивно ищет через папку. Это работает для перемещения, но когда я копирую папку, каждое событие поднимается дважды.

Я не могу найти алгоритм, так что создается только одно событие create для папок и файлов.

Спасибо за вашу помощь.

Код:

System::Void SnowDrive::Cloud::FileWatcher_Changed(System::Object^  sender, System::IO::FileSystemEventArgs^  e) 
{
    size_l  FileSize;

    string  ServerInode,
            FileName = c.marshal_as<std::string> (e -> Name),
            FilePath = c.marshal_as<std::string> (e -> FullPath),
            FtpPath  = ToFtpPath (FilePath.substr (0, FilePath.find_last_of ("\\")));

    if (FileName.find_last_of ("\\") != string::npos)
        FileName = FileName.substr (FileName.find_last_of ("\\") + 1);

    for (unsigned int i = 0; i < IgnoreFileList.size (); i++)
    {
        if (IgnoreFileList[i] == FilePath)
        {
            IgnoreFileList.erase (IgnoreFileList.begin () + i);

            return;
        }
    }

    if (!FileSystem::IsDir (FilePath))
    {
        FileSystem::FileSize (FilePath, &FileSize);

        if (FileSize != 0)
            IgnoreFileList.push_back (FilePath); // ignore twice changed events

        // do something
    }
    else
    {
        if (sender -> ToString () != " ")
            return;

        DIR * Dir;

        dirent * FindData;

        if((Dir = opendir(FilePath.c_str ())) == NULL)
            return;

        while ((FindData = readdir(Dir)) != NULL)
        {
            FileName = FindData -> d_name;

            if (FileName == string (".") || FileName == string (".."))
                continue;

            FileWatcher_Changed (gcnew String (" "), gcnew IO::FileSystemEventArgs (IO::WatcherChangeTypes::Created, gcnew String (FilePath.c_str ()), gcnew String (FileName.c_str ())));
        }
    }
}

System::Void SnowDrive::Cloud::FileWatcher_Created(System::Object^  sender, System::IO::FileSystemEventArgs^  e)
{
    size_l FileSize;

    string FilePath = c.marshal_as<std::string> (e -> FullPath);

    if (!FileSystem::IsDir (FilePath))
    {
        FileSystem::FileSize (FilePath, &FileSize);

        if (FileSize != 0)
            IgnoreFileList.push_back (FilePath); // ignore twice changed events
    }

    FileWatcher_Changed (gcnew String (" "), e);
}
Теги:
events
c++-cli
filesystemwatcher

1 ответ

0

Я не знаю, как получить только одно событие " Changed как вы хотите. Однако я знаю, как получать события для перемещенных файлов. Вы захотите подключиться к событию Renamed.

Копирование папки с файлами: одно событие " Changed для папки и по одному на файл.

Перемещение папки с файлами: одно событие " Changed для папки, одно Renamed событие для каждого файла.

  • 1
    Я проверил то, что вы сказали, но, к сожалению, при перемещении папки с файлом событие Renamed не возникает
  • 0
    Да вы правы. Если вы перемещаете сам файл, вы получаете уведомление о перемещении файла. Если вы переместите каталог с файлами, вы не получите никакого уведомления для файлов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню