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

Я работаю с 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);
}

0

Решение

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

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

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

0

Другие решения


По вопросам рекламы [email protected]