|
Oleg
|
|
Как определить готовность файла?03.04.2011, 08:09. Показов 7420. Ответов 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, При запуске мигает или вообще не горит индикатор "готовность" Как определить имя открываемого в системе файла, как антивирус Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
|
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс.
Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
|
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа.
В качестве фильтра для отбора служит предопределенное значение перечислений.
Процедура. . .
|
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
|
|
Оттенки серого
Argus19 18.03.2026
Оттенки серого
Нашёл в интернете 3 прекрасных модуля:
Модуль класса открытия диалога открытия/ сохранения файла на Win32 API;
Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
|
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-rectangles-sdl3-c. zip
finish-rectangles-sdl3-cpp. zip
|
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие.
Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
|
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ВВЕДЕНИЕ
Выполняя задание на управление насосной группой заполнения резервуара,. . .
|