|
Oleg
|
|
Как определить готовность файла?03.04.2011, 08:09. Показов 7488. Ответов 62
Метки нет (Все метки)
Есть две программы. Первая копирует файлы из каталога 1 в каталог 2, а вторая ждет файл в каталоге 2, и затем копирует в каталог 3.
Вопрос: как определить закончилось копирование из каталога 1 в каталог 2? |
|
| 03.04.2011, 08:09 | |
|
Ответы с готовыми решениями:
62
Как отследить готовность запущенного процесса из приложения к работе с ним? Системные требования и готовность системы |
|
Ghost
|
|
| 12.04.2011, 16:12 | |
|
2 Oleg >> Стало быть для него открыт некий процесс. Вот окончание этого процесса я и хочу зафиксировать.
Ждать окончания ПРОЦЕССА ты можешь и заколебаться - я far manager как утром загружу, так до вечера и не выгружаю ) А вот ждать закрытия хэндла файла... вопрос в том, как его получить... я не знаю. |
|
|
0 / 0 / 1
Регистрация: 09.01.2011
Сообщений: 47
|
|
| 12.04.2011, 17:51 | |
|
Привет всем !
ну , блин , даже мне надоело смотреть на всю эту бодягу :-) Шутка ! Итак немного теории : 1) В Win32 ( а 98/NT/XP/2000 e.t.c. именно сюда и смотрят ) файловые операции являются АСИНХРОННЫМИ , т.е. выход из функции пересылки данных происходит немедленно , а ОС завершает операцию в фоновом режиме. Подобные операции носят название 'overlapped' - 'перекрывающиеся' ( поправьте меня , ежели я ошибся ). ( Но , в прочем , 'колхоз - дело добровольное' и данные операции можно и не разрешать. ) Таким образом , для данной постановки вопроса необходимо использовать API-функцию : GetOverlappedResult - получение информации о текущем состоянии перекрывающейся операции. Соответственно '0' или '1' - операция завершена ( файл полностью скопирован ) или нет. Вот , собственно и вся недолга :-))) Но ! Хотелось бы предостеречь от эйфории : коли вы работаете в сетке , то вам необходимо предусмотреть сл. вариант - источник скопировал файл , ваша прога на другом компе его отследила и начала тянуть. Если файл большой - процесс может занять некоторое время , тут источник спохватывается , 'чего-то нето в файл сунул' и начинает : а) судорожно его тереть б) переписывать по новой. Впрочем это уже ерундовые детали ... И на будущее : если ставите вопрос - конкретизируйте плз , стандартными ли вы средствами VB его хотите поиметь , функц. API , или еще как ... С уважением ...
0
|
|
|
Comanche
|
|
| 12.04.2011, 17:58 | |
|
Почитал МСДН про эту функцию. Вот что сказано про её первый аргумент:
hFile [in] Handle to the file, named pipe, or communications device. This is the same handle that was specified when the overlapped operation was started by a call to the ReadFile, WriteFile, ConnectNamedPipe, TransactNamedPipe, DeviceIoControl, or WaitCommEvent function. А откуда взять значение для этого хэндла, если файловую операцию начали не мы, а какой-нибудь FAR?! |
|
|
2 / 2 / 1
Регистрация: 19.07.2007
Сообщений: 737
|
|
| 12.04.2011, 18:52 | |
|
я по практике могу сказать, что тот код, что я ранее здесь давал - работает и в сетке и на локале
и нечего лохматить бабушку
0
|
|
|
0 / 0 / 1
Регистрация: 09.01.2011
Сообщений: 47
|
|
| 12.04.2011, 21:09 | |
|
To Comanche :
Для работы с данной функцией , необходимо использовать функции синхронизации. Чтобы долго не 'размазывать кашу по тарелке' - посмотри Д.Эпплман 'Win32 API & VB',посл.изд. , гл.14 , стр. 806, очень хорошо все описано :-))) .
0
|
|
|
0 / 0 / 0
Регистрация: 28.09.2010
Сообщений: 139
|
|
| 13.04.2011, 11:25 | |
|
Private Sub Вашкод()
'Ваш код ....... Doevents '.....и по его окончанию: 'получим сообщение о конце процесса: Msgbox 'Процесс окончен !' End Sub '-------- ПРОВЕРЬТЕ:
0
|
|
|
Oleg
|
|
| 13.04.2011, 12:07 | |
|
Tool: похоже ты единственный, кто действительно понял, что я хочу. Вот если бы еще код написал...
|
|
|
0 / 0 / 0
Регистрация: 28.09.2010
Сообщений: 139
|
|
| 13.04.2011, 13:16 | |
|
В первую очередь для автора:
Есть же хоpошая фаункция в VB: D DoEvents '----- образец использования --------- Private Sub ВашКод() ' ... что-то там копирует и т.д. DoEvents ' ждет пока процесс закончится ' после окнчания процесса можно так: Msgbox 'Процесс закончен!!' ' это мое, а вы напишите что-то далее End Sub
0
|
|
|
0 / 0 / 0
Регистрация: 28.09.2010
Сообщений: 139
|
|
| 13.04.2011, 13:19 | |
|
P.s. - первый ответ я не увидел и повторил, извините.
По поводу реплики автора. Последнее предложение может будет понятнее ??
0
|
|
|
Oleg
|
|
| 13.04.2011, 13:22 | |
|
Дмитри: извини, а процедуру ожидания процесса можно привести...
|
|
|
2 / 2 / 1
Регистрация: 19.07.2007
Сообщений: 737
|
||||||
| 13.04.2011, 13:47 | ||||||
|
даааааа, не мог сразу чтоль написать, что тебе нужно:
0
|
||||||
|
Oleg
|
|
| 13.04.2011, 13:55 | |
|
Konst_one: извини, а где в твоем коде ожидание окончания копирования файла?
|
|
|
2 / 2 / 1
Регистрация: 19.07.2007
Сообщений: 737
|
|
| 13.04.2011, 14:00 | |
|
см. SystemExecute - это тебе и нужно,
можешь копировать, можешь файлик запускать можешь че хочешь делать
0
|
|
|
Ghost
|
|
| 13.04.2011, 14:36 | |
|
1. 2 konst_one - ты предлагаешь запустить ОТ себя процесс, а потом ждать его завершения. Смотри постановку задачи - пользователь может копировать файл из любого своего приложения. То, что он это приложение сразу завершит - не сказано. Таким образом ) ты предлагаешь решать техническую проблему организационно, что, по моему опыту, обычно заканчивается провалом.
2. 2 Tool - про копирование под виндами все написал хорошо. Объясни только 1 момент - делать-то что? ) Код дашь или может укажешь где искать? Только не надо про WaitForSingleObject/GetOverlappedResult - все эти функции работают с (в рамках данной программы) хэндлом файла или устройства. ' The GetOverlappedResult function retrieves the results of an overlapped operation on the specified file, named pipe, or communications device. Windows Me/98/95: This function works only on communications devices or on files opened using the DeviceIoControl function. BOOL GetOverlappedResult( HANDLE hFile, LPOVERLAPPED lpOverlapped, LPDWORD lpNumberOfBytesTransferred, BOOL bWait ); ' В задаче же сказано 'Копирование производится пользователем любой доступной ему программой (FAR, Total Commander, проводник, и даже можно досовым Norton).'. ВОПРОС - ОТКУДА ВОЗЬМЕШЬ ХЭНДЛ - по сути я этот вопрос задал ДО твоего постинга - в 'Дата: 02.02.2005 15:35'. |
|
|
2 / 2 / 1
Регистрация: 19.07.2007
Сообщений: 737
|
|
| 13.04.2011, 14:44 | |
|
я отвечал вот на это:
<Oleg писал:> Дмитри: извини, а процедуру ожидания процесса можно привести
0
|
|
|
Ghost
|
|
| 13.04.2011, 17:27 | |
|
))) В общем - к решению задачи не приблизились.
|
|
|
Oleg
|
|
| 14.04.2011, 07:18 | |
|
А может это вообще нельзя сделать?
Маленько подумав, я провел эксперимент. Создал два каталога. В FAR начал копировать в первый каталог очень длинный файл. Запустил второй FAR и начал копировать (не дожидаясь окончания первого копирования) из первого каталога во второй. К сожалению FAR начал это копирование. Более того он скопировал несколько мег и закончил свою работу, т.е. разорвал файл!!! Тут я конечно огорчился, но... Провел еще один експеримент. Опять же в FAR начал первое копирование, а вот из первого каталога во второй я попытался не скопировать, а переместить. И вот тут то FAR написал: ╔═════════════════════ Ошибка ══════════════════════╗ ║ Нарушение совместного доступа к файлу ║ ║ Ошибка переноса Michel Vaillant.avi ║ ║ в C:Michel Vaillant.avi ║ ║ Повторить Пропустить Пропустить все Отменить ║ ╚═══════════════════════════════════════ ════════════╝ Значит как то можно проанализировать, что файл кем то захвачен! У кого еще какие мысли будут? |
|
|
Ghost
|
|
| 14.04.2011, 12:32 | |
|
2 Oleg - ну е моё - писали же - захват файла в эксклюзивном режиме - соответственно - фару выкинули ошибку совместного доступа - это еще дос умел.
А насчет перемещения... было у меня подозрение, что фар некорректно работает с файлами, оно только усиливается. Тогда рекомендую вернуться к ранее предложенному варианту - остлеживать дату изменения файла и по прошествии тайм-аута производить операции. По поводу ассинхронности... вероятно, придется исследовать вопрос. |
|
|
Messir
|
|
| 14.04.2011, 13:28 | |
|
По поводу асинхронности:
Исследовать тут ничего не надо. Операции-то сами по себе асинхронные, а вот функции, их реализующие, могут быть как асинхронными, так и синхронными. Поэтому немедленного выхода из функции после начала копирования легко избежать. Но это ни капли не поможет, если учесть тот факт, что копирование может производиться любой программой. Что можно попробовать: 1. Отслеживать блокировки для файла (т.е. пытаться открывать файл для полного доступа и ставить блокировку на весь его размер) по уведомлению об изменении файла (см. пост Comanche). Однако сетевая ошибка (пропажа коннекта к удаленной машине, внезапный ребут, отключение питания) может привести к большим багам. 2. Если копирование производится все же не любой программой, а какой-то конкретной (даже не обязательно своего 'производства', хотя своей, разуммется,лучше), то проще внедрить туда механизм уведомления об окончании процесса копирования (через сокеты или пайпы). Используя такой способ, легко можно избежать багов с обрывом связи. 3. Даже если копируем почти произвольной прогаммой (однако для копирования эти программы используют более-менее стандартные функции), можно перехватывать API-вызовы и внедрить туда механизм уведомления. 4. Если копирование производится по smb, можно попробовать мониторить подключения/отключения пользователей и файлы, открываемые ими. При таком раскладе отпадает необходимость что-либо ставить на коппьютере-источнике, но ошибки пропадания связи никак не отслеживаются. В принципе, можно придумать еще чего-нибудь. Только думать напряжно
|
|
| 14.04.2011, 13:28 | |
|
Помогаю со студенческими работами здесь
60
Принтер HP LJ1300 не выходит в готовность код, определяющий готовность диска к работе не работает СМА Bosch WLF 20180 OE/01, уходит в готовность СМА BOSCH WOL2050EU SN485090222627000180, При запуске мигает или вообще не горит индикатор "готовность" Как определить имя открываемого в системе файла, как антивирус Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2.
Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
|
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
|
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2.
Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
|
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2.
Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом.
В. . .
|
|
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2.
Задача: отобразить спецтехнику, которая на данный момент находится в ремонте.
Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
|
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
|
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
|
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут
Суть:
- Группа наркоманов из 10 человек.
- Только один инфицирован ВИЧ.
- Колются одной иглой.
- Колются раз в день.
- Колются последовательно через. . .
|