Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 10, 2012 14:40:08

yield
От:
Зарегистрирован: 2011-05-10
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

как определить, что файл дописался

Всем привет!
win32, python2.5
В папку поступают файлы со сканера, программа постоянно сканирует эту папку, обрабатывает полученные файлы, после чего их удаляет.
Вопрос: как определить, что файл полностью записан и больше ни кем не используется?



Отредактировано yield (Окт. 10, 2012 14:49:26)

Офлайн

#2 Окт. 10, 2012 15:09:18

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

как определить, что файл дописался

Плохо себе представляю прогу для сканера, которая сначала создает файл, а потом в него добавляет байты по мере сканирования. Или Вы о другом?



Офлайн

#3 Окт. 10, 2012 15:22:24

yield
От:
Зарегистрирован: 2011-05-10
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

как определить, что файл дописался

да не важно какая программа, вопрос - КАК ОПРЕДЕЛИТЬ, ЧТО ФАЙЛ ПОЛНОСТЬЮ ЗАПИСАН!



Офлайн

#4 Окт. 10, 2012 16:12:28

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

как определить, что файл дописался

ИМХО ты или чего то не договариваешь, либо проблема надуманная.



Офлайн

#5 Окт. 10, 2012 16:51:26

adray
Зарегистрирован: 2012-09-15
Сообщения: 123
Репутация: +  18  -
Профиль   Отправить e-mail  

как определить, что файл дописался

под linux есть fcntl и lsof для работы с файловыми дескрипторами.
на win наверняка есть аналоги. Еще можно использовать блокировки процессов и грязный хак с переименованием(win)

Офлайн

#6 Окт. 10, 2012 17:22:08

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

как определить, что файл дописался

Я думаю, что файл, открытый для записи, ты не сможешь открыть для чтения, или для записи - здесь почти уверен.

И определять ты будешь не что файл полностью записан, а что он не открыт (для записи).

Офлайн

#7 Окт. 10, 2012 18:18:24

yield
От:
Зарегистрирован: 2011-05-10
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

как определить, что файл дописался

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

Разверну подробнее мою ситуацию:
- 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') всегда срабатывает???



Офлайн

#8 Окт. 10, 2012 20:17:14

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

как определить, что файл дописался

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

Отредактировано reclosedev (Окт. 10, 2012 20:18:16)

Офлайн

#9 Окт. 11, 2012 02:00:14

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  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



Офлайн

#10 Окт. 11, 2012 13:55:42

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

как определить, что файл дописался

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

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

Отредактировано s0rg (Окт. 11, 2012 14:01:37)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version