Форум сайта python.su
0
Всем привет!
win32, python2.5
В папку поступают файлы со сканера, программа постоянно сканирует эту папку, обрабатывает полученные файлы, после чего их удаляет.
Вопрос: как определить, что файл полностью записан и больше ни кем не используется?
Отредактировано yield (Окт. 10, 2012 14:49:26)
Офлайн
568
Плохо себе представляю прогу для сканера, которая сначала создает файл, а потом в него добавляет байты по мере сканирования. Или Вы о другом?
Офлайн
0
да не важно какая программа, вопрос - КАК ОПРЕДЕЛИТЬ, ЧТО ФАЙЛ ПОЛНОСТЬЮ ЗАПИСАН!
Офлайн
568
ИМХО ты или чего то не договариваешь, либо проблема надуманная.
Офлайн
18
под linux есть fcntl и lsof для работы с файловыми дескрипторами.
на win наверняка есть аналоги. Еще можно использовать блокировки процессов и грязный хак с переименованием(win)
Офлайн
14
Я думаю, что файл, открытый для записи, ты не сможешь открыть для чтения, или для записи - здесь почти уверен.
И определять ты будешь не что файл полностью записан, а что он не открыт (для записи).
Офлайн
0
Проверил: скопировал традиционным способом файл пожирнее, пока он записывался не открывался (чтение/запись - ошибка). Вроде как работает.
Разверну подробнее мою ситуацию:
- 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
Офлайн
173
yieldМожет программа открывает его с FILE_SHARE_READ (winapi)?
Почему ИНОГДА fs==0, если open(f,'rb') всегда срабатывает???
adray
грязный хак с переименованием(win)
Отредактировано reclosedev (Окт. 10, 2012 20:18:16)
Офлайн
20
> файл, открытый для записи, ты не сможешь открыть
1. Сможешь. Есть понятие эксклюзивного открытия, но это платформозщависимая фича, вот тогда открыть открытый (для записи) кем-то ещё файл не получится.
2. Решение влоб – смотреть mtime, или следить за изменением размера файла.
3. Под линукс можно использовать inotify, для фряхи тоже есть подобная фича.
4. И для верности проверять целостность файла, хотя его незавершённость и по ходу обработки выяснится. В случае с форматами (мы ведь про изображения говорим?) не упаковываемыми (например , bmp), целостность (точнее полнота) вычисляется лёгкой арифметикой, в противном случае, придётся обрабатывать все данные (распаковывать), что бы убедиться в завершённости формата. Рассёт – ненадёжный вариант, никто не может гарантировать, что приложение не создат сначала файл нужного (если можно вычислить) размера, а затем (в произвольном порядке) будет его заполнять, bmp (и ко.) так не проверишь.
Я бы сделал примерно так:
1. inotify (для крутых перцев :-) || 3сек. < mtime
2. open in exclusive mode
3. обработка, при ошибке:
3a. ждать 3сек.
3b. goto 2
..bw
Офлайн
25
bwИ для win тоже - ReadDirectoryChangesW
3. Под линукс можно использовать inotify, для фряхи тоже есть подобная фича.
Отредактировано s0rg (Окт. 11, 2012 14:01:37)
Офлайн