Я пишу программу GUI, которая синхронизирует файлы в папке с сервером. Информация, которую я знаю об этих файлах, заключается в том, что они всегда записываются и не удаляются. Моя задача - начать загрузку файла во время его написания. Поэтому, чтобы этого избежать, я придумал способ решения проблемы, и мне нужен какой-то эксперт, чтобы рассказать мне, что это неправильно.C++: размер файла монитора. Это может быть проблематично?
Так что я делаю то, что у меня есть цикл событий с таймером. Каждый раз, когда этот таймер гаснет, он смотрит, добавляются ли новые файлы. Если новые файлы будут найдены, я использую эту простую функцию, чтобы получить размер файла:
std::size_t GetFileSize(const std::string &filename)
{
std::ifstream file(filename.c_str(), std::ios::binary | std::ios::ate);
return file.tellg();
}
Затем я сохраняю новый файл (ы) имя, размер в структуре данных формы (без учета std::
сделать это визуально дружественным, как есть 5 должны быть записаны в следующей строке):.
deque<pair<string, pair<size_t, long> > fileMonitor;
(пожалуйста, предложите лучшую структуру данных, если это возможно unordered_multimap
, кажется, делает подобную работу).
Таким образом, это сохранит имя файла (в этой строке), его размер (в этом size_t) и количество раз, когда размер файла был отмечен без изменения, назовем его checks
. Поэтому каждый раз, когда таймер тикает, я ищу новые файлы и проверяю, изменился ли размер файлов в fileMonitor
. Для одного файла, если размер файла отличается от предыдущего, то checks = 1
, и если размер файла тот же, то я делаю checks++
.
Теперь на каждой итерации я проверяю, установлен ли таймер interval*checks > timeout
, тогда файл не изменился достаточно долго, и я могу судить о том, что файл стабилен и не обновляется.
Очевидный вопрос: Почему я не использую что-то вроде inotify
? Потому что мне нужно что-то кроссплатформенное и простое в структуре, так как я уже знаю поведение файлов, которые я собираюсь загрузить. К сожалению, boost не дает решения для этого, поэтому мне пришлось изобретать свои собственные.
Действительно ли ваш 'GetFileSize' работает? Лично я бы назвал 'stat', чтобы получить размер и время последней модификации. – melpomene
@melpomene Извините, что вы имеете в виду под «на самом деле работает»? Вы имеете в виду работы при обновлении размера файла или, как правило, для любого файла? Он работает для обычных файлов без проблем. –