C / C ++ определить, были ли файлы полностью написаны - PullRequest
0 голосов
/ 10 сентября 2010

У меня есть каталог ( DIR_A ) для дампа с сервера A на сервер B, который, как ожидается, займет несколько недель. DIR_A имеет нормальную древовидную структуру, т. Е. Каталог может содержать подпапки или файлы и т. Д.

Цель: Поскольку DIR_A выгружается на сервер BМне придется пройти через DIR_A и найти в нем определенные файлы (не знаю точного имени каждого файла, потому что сервер А изменяет имена всех отправляемых файлов).Я не могу ждать недели, чтобы обработать некоторые файлы в DIR_A .Итак, я хочу начать манипулировать некоторыми файлами, как только получу их на сервере B.

Краткое описание: Сервер A отправляет DIR_A на сервер B. Предполагается, что он будет занятнедель.Я должен начать обработку файлов в точке B до завершения загрузки.

Попытка идеи: Я решил написать программу, в которой будет перечислено содержимое DIR_A .Я продолжал выяснять, существуют ли файлы в папках и подпапках DIR_A .Я подумал, что могу искать EOF файла в DIR_A .Если его нет, то файл еще не был полностью загружен.Я должен подождать, пока EOF не будет найден.Итак, я продолжаю цикл, вычисляя размер файла и проверяя, присутствует ли EOF.Если это так, то я начинаю обрабатывать этот файл.

Чтобы смоделировать вышесказанное, я решил написать и выполнить запись программы в текстовый файл, а затем остановил его посередине, не дожидаясь завершения.Я попытался использовать программу ниже, чтобы определить, можно ли найти EOF.Я предположил, что, поскольку я резко закончил запись программы в текстовый файл, eof не будет присутствовать, и поэтому вывод "EOF FOUND" не должен быть достигнут.Я не прав, так как это было достигнуто.Я также пытался с feof () и fseek ().

std::ifstream file(name_of_file.c_str, std::ios::binary);
//go to the end of the file to determine eof
char character;
file.seekg(0, ios::end);
while(!file.eof()){

    file.read(character, sizeof(char));

}
file.close();
std::cout << "EOF FOUND" << std::endl

Может ли кто-нибудь дать представление о том, был ли файл полностью записан или нет?

Спасибо

Ответы [ 4 ]

2 голосов
/ 10 сентября 2010

EOF - это просто способ C ++ сказать вам, что данных больше нет.Не существует EOF-символа, который можно использовать для проверки того, что файл полностью записан.

Обычно это достигается путем передачи файла с одним именем, т.е.передача завершена, переместите файл на целевой хост (обратно к чему-то вроде myfile.txt).Вы можете сделать то же самое, используя отдельные каталоги.

0 голосов
/ 10 сентября 2010

Ни в C, ни в C ++ нет стандартного способа определить, открыт ли файл для записи другим процессом.У нас похожая ситуация: сервер, который отправляет нам файлы, и мы должны забрать их и обработать как можно скорее.Для этого мы используем Linux * подсистему inotify, с часами, настроенными для событий IN_CLOSE_WRITE (файл был закрыт после того, как был открыт для записи), который упакован в boost :: asio :: posix :: stream_descriptorудобная асинхронность.

В зависимости от операционной системы у вас может быть подобное средство.Или просто lsof, как уже предлагалось.

0 голосов
/ 10 сентября 2010

Все конечные файлы имеют конец.Если файл записывается одним процессом и (при условии, что это позволяет ОС) одновременно считывается (быстрее, чем записывается) другим процессом, тогда процесс чтения увидит EOF, когда он прочитает все символы, которые были записаны.записано.

Что, вероятно, будет работать лучше, если вы можете определить период времени, в течение которого вы можете гарантировать получение значительного количества байтов и записать их в файл (остерегайтесь буферизации ОС),затем вы можете просматривать каталог один раз за период, и любой файл, который изменил размер файла, может считаться незаконченным.

Другой подход потребует поддержки ОС: проверьте, какие файлы открываются принимающим процессом, с помощьюинструмент как lsof.Любой файл, открытый получателем, незакончен.

0 голосов
/ 10 сентября 2010

В C, и я думаю, что то же самое в C++, EOF не символ; это условие, в котором находится файл (или нет). Также как media removed или network down не является символом.

...