Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2007.08.12;
Скачать: [xml.tar.bz2];

Вниз

Завершена ли передача файла по сети   Найти похожие ветки 

 
Victor_Ked   (2007-05-31 11:21) [0]

Нужно обрабатывать файлы, периодически поступающие из сети в локальную папку. Программа периодически сканирует папку (FindFirst .. FindNext). Но обработка файла часто начинается, когда он еще не полностью закачан! Как узнать, завершилась ли перекачка файла по сети или еще нет?


 
Сергей М. ©   (2007-05-31 11:40) [1]

Что за файлы ?
Кто и какими средствами их передает ?


 
Victor_Ked   (2007-05-31 11:49) [2]

Обычные BMP-файлы со сканера. Сканер по завершению сканирования передает файл (файлы) по сети в папку. В папке создается заголовок файла с нулевой длиной. Программа тут же ловит его и хочет обработать. Но файла то еще нет!


 
Плохиш ©   (2007-05-31 11:52) [3]

Попытка открыть эксклюзивно не поможет? Или размер проверять


 
Сергей М. ©   (2007-05-31 11:56) [4]


> В папке создается заголовок файла с нулевой длиной. Программа
> тут же ловит его и хочет обработать


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


 
Victor_Ked   (2007-05-31 11:58) [5]

Открывать то нечего, пока файл не передан полностью. А размеры файлов в общем случае разные. Нужна функция, возвращающая "добро" только в случае завершения передачи.


 
Сергей М. ©   (2007-05-31 12:01) [6]


> Нужна функция, возвращающая "добро" только в случае завершения
> передачи


Она проста до безобразия:

try
 SomeBitmapObject.LoadFromFile(...);
 Result := "добро";
except
 Result := "зло";
end;


 
Victor_Ked   (2007-05-31 12:03) [7]

To Сергей М.

В процессе передачи размер файла может меняться (1М, 2М, ..). А заголовки корректные.


 
clickmaker ©   (2007-05-31 12:06) [8]


> [7] Victor_Ked   (31.05.07 12:03)

пробуй открывать файл для записи


 
Сергей М. ©   (2007-05-31 12:07) [9]


> А заголовки корректные


Зато данные, следующие за корректным заголовком, могут быть некорректны.
И попытка интерпретировать эти некорректные данные, например, средствами [6], должна привести к исключению, что в дан.ситуации как раз и можно трактовать как "неготовность" файла к обработке.


 
Victor_Ked   (2007-05-31 12:07) [10]

Процедура LoadFromFile корректно работает! Exept не возникает, даже если перекачано только половину файла. Но BitMap наполовину черный!


 
Сергей М. ©   (2007-05-31 12:20) [11]

Значит реализуй собственную проверку, по образу и подобию метода TBitmap.ReadDIB, но с возбуждением желаемого исключения.


 
Victor_Ked   (2007-05-31 12:24) [12]

По-видимому, стандартного способа не существует. Спасибо всем!


 
ЮЮ ©   (2007-05-31 12:25) [13]

>Сканер по завершению сканирования передает файл (файлы) по сети в папку

Пусть передает сразу в нужеую папку :)

А может просто не сразу пытаться качать, а с несколькисекундной задержкой от даты изменения файла?


 
Victor_Ked   (2007-05-31 12:29) [14]

To ЮЮ.

Решение с временной задержкой - самое простое, но некрасивое и неэффективное при большой загрузке сети.


 
Плохиш ©   (2007-05-31 12:35) [15]

Так я не понял, что говорит TFileStream.Create(Filename, fmOpenRead or fmShareExclusive); ?


 
ЮЮ ©   (2007-05-31 12:37) [16]

> Решение с временной задержкой - самое простое, но некрасивое
> и неэффективное при большой загрузке сети.


А не ты ли её грузишьсвоим Программа периодически сканирует папку (FindFirst .. FindNext). ? :)
Неужели он так загружена, что за несколько секунд и байта переслать не способна?


 
Victor_Ked   (2007-05-31 12:44) [17]

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

То Плохиш - А поток создавать не очень-то хочется.


 
ЮЮ ©   (2007-05-31 12:48) [18]

> Где гарантия, что после (к примеру) десяти секуд передача
> завершится?

Ну что-то изменится должно за 10 секунд - размер, дата создания/изменения

> А поток создавать не очень-то хочется.
Религия не позволяет?


 
Сергей М. ©   (2007-05-31 12:53) [19]


> Victor_Ked   (31.05.07 12:44) [17]


Я так понял, что синхронизировать два процесса (сканирующий и обрабатывающий) не представляется возможным ? Или ты попросту об этом не задумывался ?


 
Victor_Ked   (2007-05-31 12:58) [20]

Синхронизировать их физически невозможно. Сканер должен работать автономно. Сканируют в разных местах разные люди в разное время. А сканер скидывает результат в сетевую папку. Нужно побыстрее обработать поступающие изображения. Проблема возникает как раз в момент передачи.


 
Сергей М. ©   (2007-05-31 13:02) [21]


> сканер скидывает результат в сетевую папку


Сканер ничего никуда не "скидывает".

"Скидывает" программное обеспечение, под управлением которого работает сканер.

Вот его-то, это самое ПО, и следует, в первую очередь, рассмотреть на предмет возможности синхронизации с твоим ПО.


 
Плохиш ©   (2007-05-31 13:03) [22]


> Victor_Ked   (31.05.07 12:44) [17]

Думается, что ветка бессмысленная...


 
SpellCaster   (2007-05-31 13:04) [23]

Кстати, тоже сталкивался с такой траблой. Если качают по сети, то вполне вероятен вариант, что файл не считается открытым (по крайней мере, когда это происходит через ФТП). Хотя можно попытаться открыть его в эксклюзивном режиме. Ну или такой вариант - просто периодически получать размер файла, и если, положим, за 10 секунд он не изменился, то считать картинку готовой.
Либо самому читать и декодировать заголовок - он у БМП довольно простенький. Там в начале указывается размер картинки в пикселах и глубина цвета, из этого элементарно получается дОлжный размер файла.


 
Victor_Ked   (2007-05-31 13:07) [24]

Но ведь задача то - универсальная. Сканер тут ни при чем. Кто-то может просто послать готовый файл в папку на обработку. В момент предачи по сети возникнет та же проблема.


 
Сергей М. ©   (2007-05-31 13:10) [25]


> задача то - универсальная


Нет в ней никакой "универсальности".

Эту задачу следует рассматривать в этих конкретных условиях.


 
Сергей М. ©   (2007-05-31 13:11) [26]


> Кто-то может просто послать готовый файл в папку на обработку


ССЗБ.

Сначала придумал проблему, теперь ее героически преодолеваешь)


 
Victor_Ked   (2007-05-31 13:22) [27]

Спасибо всем. Что-нибудь придумаю. Такая проблема всегда появляется при необходимости быстрой обработки файлов, поступающих из сети вне зависимости от источника передачи.


 
Сергей М. ©   (2007-05-31 13:25) [28]


> поступающих из сети


Задумайся над этим серьезно.

"Поступление из сети" вовсе не означает, что речь может идти только о расшаренных папках и ни о чем более.


 
Victor_Ked   (2007-05-31 13:37) [29]

Действительно! Сеть здесь ни при чем! Та же ситуация происходит при копировании относительно больших файлов (~10М) из локальной в локальную папку, где происходит обработка.


 
Сергей М. ©   (2007-05-31 13:40) [30]


> Сеть здесь ни при чем


Конечно ни при чем, если ты упервся рогом в копировании любыми подручными средствами, а не средствами своей разработки, специально "заточенных" на синхронизацию с твоим же обрабатывающим софтом)


 
DiamondShark ©   (2007-05-31 14:40) [31]


> Victor_Ked

Открыть файл эксклюзивно.
Открыть файл эксклюзивно.
Открыть файл эксклюзивно.
Открыть файл эксклюзивно.
Открыть файл эксклюзивно.
Открыть файл эксклюзивно.
Открыть файл эксклюзивно.
Открыть файл эксклюзивно.
Открыть файл эксклюзивно.
Открыть файл эксклюзивно.

Я вижу, что если написано один раз, то не доходит. Если написано несколько раз, но между разами многавукаф, то тоже не доходит.
Может так дойдёт.


 
Сергей М. ©   (2007-05-31 14:52) [32]


> DiamondShark ©   (31.05.07 14:40) [31]


Ну не факт, что это поможет, хотя и может помочь.

Автор-то ведь уперся рогом в свою шару и боле не хочет ничего видеть.
То ли туп он, то ли ламер aka воинствующий дилетант.

А ты ему - "не доходит"))


 
DiamondShark ©   (2007-05-31 15:06) [33]


> Ну не факт, что это поможет, хотя и может помочь.

Ну, тут можно пуститься в философию типа: "что значит завершена передача".
Мне это скучно, и я волюнтаристски заявляю, что если файл не открыт ни одним процессом, то это и означает, что что бы там с файлом не происходило, то оно "завершено", что бы под этим ни понимать. Иначе попытка эксклюзивного открытия получит отлуп.

У автора же, судя по всему, какая-то файлоподхватывалка.
Файлы ему всё равно грузить, так чего бы не создать файлстрим с флажком эксклюзивности, а из него уже грузить.

Ну, а о результатах поможет/не поможет -- сам доложит.


 
Victor_Ked   (2007-05-31 17:55) [34]

Спасибо Плохишу за идею и DiamondShark за обьяснение! Эксклюзив помог - при неполном файле нормально вызывается Exception. Сначала идея не вызывала доверия: файл открывает только одна программа. Но додуматься, что при передаче по сети файл открыт сетевыми службами я сам не смог.
СПАСИБО!!!


 
Anatoly Podgoretsky ©   (2007-05-31 19:53) [35]


> В папке создается заголовок файла с нулевой длиной

Это тебе еще везет, более общий случай создания файла сразу нужного размера, при этом в дальнейшем ни размер ни даты возможно меняться не будут.

Исключение частный случай, считай, что тоже повезло, более частый случай попытка открытия в эксклузивном режиме приводит к ошибке в записывающей программе.

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


 
DiamondShark ©   (2007-06-06 11:54) [36]


> более частый случай попытка открытия в эксклузивном режиме
> приводит к ошибке в записывающей программе.

Так не бывает.


 
Evgeny V ©   (2007-06-06 12:10) [37]

Если файл пишется за один раз в один прием (создан, записан блок... записан..блок.... записан блок... закрыт), то в принципе возможно... все будет работать при эксклюзивном доступе к файлу, а если файл может дописываться..или модифицироваться  (то есть открываться и закрываться программой-отправителем несколько раз), то смотри
Anatoly Podgoretsky ©   (31.05.07 19:53) [35]


 
авыф   (2007-06-06 13:57) [38]

а если от сканера посылать файл в нужную папку но с названием ***.tmp, а когда передача файла завершится то чтобы "сканер" переименовывал файл ***.bmp...


 
Belorus ©   (2007-06-06 22:56) [39]

Читал ветку, и дочитав до середины реально задумался ... Было 2 варианта.
1. Либо реально эксклюзивное право доступа не очень эсклюзивное.
2. Аффтар неадекватен, и не слушает других.
Оказалось второе :)

Вот ей-богу, как мелодраму посмотрел.
В начале проблема, потом несколько вариантов решения, среди которых есть верный и очевидный вариант, который естессно проигнорирован аффтаром, потом долгая беседа с Сергей.М над неким вторым вариантом решении проблем, в результате которой аффтар ничего не понял(хотя варианты не биться лбом в стену и изучить ПО которое работает со сканером - весьма хорошая идея), в итоге некто DiamondShark понял что  
2. Аффтар неадекватен
и решил повторить верный вариант решения. Помогло :) А то ещё запаниковали бы :) Смешно...... Просто смешно.....



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2007.08.12;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.55 MB
Время: 0.047 c
15-1184678519
Nous Mellon_
2007-07-17 17:21
2007.08.12
Как настроить .htaccess?


3-1177453476
TTable
2007-04-25 02:24
2007.08.12
Как получить указатель на строку в Table1.Fields[2].AsString ?


15-1184416042
de.
2007-07-14 16:27
2007.08.12
Ломится.


2-1184759566
EugeneXP
2007-07-18 15:52
2007.08.12
Создание точного таймера до сотых секунды


2-1184610269
Knob
2007-07-16 22:24
2007.08.12
Как добавить в список





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский