Я работаю с 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);
}
Я не знаю, как получить только одно событие " Changed
как вы хотите. Однако я знаю, как получать события для перемещенных файлов. Вы захотите подключиться к событию Renamed
.
Копирование папки с файлами: одно событие " Changed
для папки и по одному на файл.
Перемещение папки с файлами: одно событие " Changed
для папки, одно Renamed
событие для каждого файла.