C ++ ReadDirectoryChangesW и Boost возвращает изменение dir в виде файла (старое имя)

У меня есть приложение, которое отслеживает каталоги на наличие изменений. Однако, когда я переименую каталог, допустим, скажем, каталог A в каталог B, тогда я увижу следующие выходные данные:

File renamed (OLD): C:\A
Directory renamed (NEW): C:\B

пока жду выхода:

Directory renamed (OLD): C:\A
Directory renamed (NEW): C:\B

Этот случай также происходит при удалении каталога, давая вывод:

File removed: C:\A\test.txt
File modified: C:\A
File removed: C:\A

пока жду выхода:

File removed: C:\A\test.txt
Directory modified: C:\A
Directory removed: C:\A

Код, который я использую для получения этого вывода (используя файловую систему Boost):

while(true) {
FILE_NOTIFY_INFORMATION* info = reinterpret_cast<FILE_NOTIFY_INFORMATION*>(p);
int ret = ::WideCharToMultiByte(CP_ACP, 0, info->FileName, info->FileNameLength / sizeof(WCHAR), FilePathChar, sizeof(FilePathChar), NULL, NULL);
stringstream FilePathStream;
FilePathStream << argv[1];
FilePathStream << "\\";
FilePathStream << FilePathChar;
string FilePath = FilePathStream.str();
cout << FilePath << endl;
boost::filesystem::path path(FilePath);
string Type = "File";
if (boost::filesystem::is_directory(path)) {
Type = "Directory";
}
ofstream myfile;
myfile.open("changes.txt", std::ios_base::app);
switch (info->Action) {
case FILE_ACTION_ADDED:
myfile << Type << " added: " << FilePath << "\n";
break;
case FILE_ACTION_MODIFIED:
myfile << Type << " modified: " << FilePath << "\n";
break;
case FILE_ACTION_REMOVED:
myfile << Type << " removed: " << FilePath << "\n";
break;
case FILE_ACTION_RENAMED_NEW_NAME:
myfile << Type << " renamed (NEW): " << FilePath << "\n";
break;
case FILE_ACTION_RENAMED_OLD_NAME:
myfile << Type << " renamed (OLD): " << FilePath << "\n";
break;
default:
myfile << Type << " UNDISCOVERED ACTION: " << FilePath << "\n";
break;
}
myfile.close();
::memset(FilePathChar, '\0', sizeof(FilePathChar));
if (!info->NextEntryOffset) break;
p += info->NextEntryOffset;
}

Что я здесь не так делаю?

0

Решение

Проблема в том, что в обоих случаях вы не получите уведомление, пока каталог больше не вызывается C:\A (либо потому, что он был удален или перемещен). Итак, когда вы идете:

if (boost::filesystem::is_directory(path)) {
Type = "Directory";
}

is_directory возвращается false (так что вы уходите Type как "File")

Я предлагаю вместо этого:

const std::string Type = boost::filesystem::is_directory(path)    ? "Directory" :
boost::filesystem::is_regular_file(path) ? "File" :
"unknown";
2

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

Других решений пока нет …

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