yield
Окт. 10, 2012 14:40:08
Всем привет!
win32, python2.5
В папку поступают файлы со сканера, программа постоянно сканирует эту папку, обрабатывает полученные файлы, после чего их удаляет.
Вопрос: как определить, что файл полностью записан и больше ни кем не используется?
FishHook
Окт. 10, 2012 15:09:18
Плохо себе представляю прогу для сканера, которая сначала создает файл, а потом в него добавляет байты по мере сканирования. Или Вы о другом?
yield
Окт. 10, 2012 15:22:24
да не важно какая программа, вопрос - КАК ОПРЕДЕЛИТЬ, ЧТО ФАЙЛ ПОЛНОСТЬЮ ЗАПИСАН!
FishHook
Окт. 10, 2012 16:12:28
ИМХО ты или чего то не договариваешь, либо проблема надуманная.
adray
Окт. 10, 2012 16:51:26
под linux есть fcntl и lsof для работы с файловыми дескрипторами.
на win наверняка есть аналоги. Еще можно использовать блокировки процессов и грязный хак с переименованием(win)
odnochlen
Окт. 10, 2012 17:22:08
Я думаю, что файл, открытый для записи, ты не сможешь открыть для чтения, или для записи - здесь почти уверен.
И определять ты будешь не что файл полностью записан, а что он не открыт (для записи).
yield
Окт. 10, 2012 18:18:24
Проверил: скопировал традиционным способом файл пожирнее, пока он записывался не открывался (чтение/запись - ошибка). Вроде как работает.
Разверну подробнее мою ситуацию:
- 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
Окт. 10, 2012 20:17:14
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
Окт. 11, 2012 02:00:14
> файл, открытый для записи, ты не сможешь открыть
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
Окт. 11, 2012 13:55:42
bw
3. Под линукс можно использовать inotify, для фряхи тоже есть подобная фича.
И для win тоже - ReadDirectoryChangesW
По сути задачи - можно еще проверять открыт ли этот файл каким-нибудь еще процессом - если нет - то скорее всего он записан (конечно, контроль целостности - тоже не повредит) но это платформозависимо.