Найти - Пользователи
Полная версия: как определить, что файл дописался
Начало » Python для новичков » как определить, что файл дописался
1 2
yield
Всем привет!
win32, python2.5
В папку поступают файлы со сканера, программа постоянно сканирует эту папку, обрабатывает полученные файлы, после чего их удаляет.
Вопрос: как определить, что файл полностью записан и больше ни кем не используется?
FishHook
Плохо себе представляю прогу для сканера, которая сначала создает файл, а потом в него добавляет байты по мере сканирования. Или Вы о другом?
yield
да не важно какая программа, вопрос - КАК ОПРЕДЕЛИТЬ, ЧТО ФАЙЛ ПОЛНОСТЬЮ ЗАПИСАН!
FishHook
ИМХО ты или чего то не договариваешь, либо проблема надуманная.
adray
под linux есть fcntl и lsof для работы с файловыми дескрипторами.
на win наверняка есть аналоги. Еще можно использовать блокировки процессов и грязный хак с переименованием(win)
odnochlen
Я думаю, что файл, открытый для записи, ты не сможешь открыть для чтения, или для записи - здесь почти уверен.

И определять ты будешь не что файл полностью записан, а что он не открыт (для записи).
yield
Проверил: скопировал традиционным способом файл пожирнее, пока он записывался не открывался (чтение/запись - ошибка). Вроде как работает.

Разверну подробнее мою ситуацию:
- cканер отправляет на свой сервер отсканированные данные
- программа (AccXES Client Tools) “забирает” с сервера файлы и пишет в папку
- моя программа сканит папку и обрабатывает полученные файлы

Вот часть кода:
while 1:
    for f in glob.glob(folder):
        time.sleep(.1)
        fo = open(f,'rb')
        fs = os.stat(f).st_size

Почему ИНОГДА fs==0, если open(f,'rb') всегда срабатывает???
reclosedev
yield
Почему ИНОГДА fs==0, если open(f,'rb') всегда срабатывает???
Может программа открывает его с FILE_SHARE_READ (winapi)?
Попробуйте
adray
грязный хак с переименованием(win)

Или что-то такое
http://stackoverflow.com/questions/182197/how-do-i-watch-a-file-for-changes-using-python
bw
> файл, открытый для записи, ты не сможешь открыть
1. Сможешь. Есть понятие эксклюзивного открытия, но это платформозщависимая фича, вот тогда открыть открытый (для записи) кем-то ещё файл не получится.
2. Решение влоб – смотреть mtime, или следить за изменением размера файла.
3. Под линукс можно использовать inotify, для фряхи тоже есть подобная фича.
4. И для верности проверять целостность файла, хотя его незавершённость и по ходу обработки выяснится. В случае с форматами (мы ведь про изображения говорим?) не упаковываемыми (например , bmp), целостность (точнее полнота) вычисляется лёгкой арифметикой, в противном случае, придётся обрабатывать все данные (распаковывать), что бы убедиться в завершённости формата. Рассёт – ненадёжный вариант, никто не может гарантировать, что приложение не создат сначала файл нужного (если можно вычислить) размера, а затем (в произвольном порядке) будет его заполнять, bmp (и ко.) так не проверишь.

Я бы сделал примерно так:
1. inotify (для крутых перцев :-) || 3сек. < mtime
2. open in exclusive mode
3. обработка, при ошибке:
3a. ждать 3сек.
3b. goto 2

..bw
s0rg
bw
3. Под линукс можно использовать inotify, для фряхи тоже есть подобная фича.
И для win тоже - ReadDirectoryChangesW

По сути задачи - можно еще проверять открыт ли этот файл каким-нибудь еще процессом - если нет - то скорее всего он записан (конечно, контроль целостности - тоже не повредит) но это платформозависимо.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB