Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/36: Рейтинг темы: голосов - 36, средняя оценка - 5.00
Oleg

Как определить готовность файла?

03.04.2011, 08:09. Показов 7420. Ответов 62
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть две программы. Первая копирует файлы из каталога 1 в каталог 2, а вторая ждет файл в каталоге 2, и затем копирует в каталог 3.
Вопрос: как определить закончилось копирование из каталога 1 в каталог 2?
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.04.2011, 08:09
Ответы с готовыми решениями:

как проверить готовность принтера?
как проверить готовность принтера?

Как отследить готовность запущенного процесса из приложения к работе с ним?
Добрый день! Я произвожу запуск *.exe из приложения на c#. Мне необходимо понять, когда *.exe закончит запуск и будет готова для работы...

Системные требования и готовность системы
Всем здравствовать. Буквально недавно, по источникам Mail.ru, Microsoft обнародовала минимальные системные требования к Win10. Мало...

62
Comanche
12.04.2011, 15:33
Студворк — интернет-сервис помощи студентам
Дык эти АПИшки я и предложил в следующем посте.
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
даааааа, не мог сразу чтоль написать, что тебе нужно:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
Option Explicit
 
'**********************************************************
' Описания для установки приоритета процесса
'----------------------------------------------------------
Public Enum PriorityEnum
  NORMAL_PRIORITY_CLASS = &H20
  IDLE_PRIORITY_CLASS = &H40
  HIGH_PRIORITY_CLASS = &H80
End Enum
 
Private Declare Function GetCurrentProcess Lib 'kernel32' () As Long
Private Declare Function SetPriorityClass Lib 'kernel32' (ByVal hProcess As Long, ByVal dwPriorityClass As Long) As Long
 
'**********************************************************
' Описания для исполнения коммандной строки
'----------------------------------------------------------
Public Enum WindowStyle
  SW_HIDE = 0
  SW_NORMAL = 1
  SW_MAXIMIZE = 3
  SW_MINIMIZE = 6
End Enum
 
Private Declare Function CreateProcessA Lib 'kernel32' (ByVal lpApplicationName As Long, ByVal lpCommandLine As String, ByVal lpProcessAttributes As Long, ByVal lpThreadAttributes As Long, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, ByVal lpEnvironment As Long, ByVal lpCurrentDirectory As Long, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long
Private Declare Function WaitForSingleObject Lib 'kernel32' (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function GetExitCodeProcess Lib 'kernel32' (ByVal hProcess As Long, lpExitCode As Long) As Long
Private Declare Function CloseHandle Lib 'kernel32' (ByVal hObject As Long) As Long
Private Const INFINITE = -1&
Private Const STARTF_USESHOWWINDOW = &H1
Private Type STARTUPINFO
  cb As Long
  lpReserved As String
  lpDesktop As String
  lpTitle As String
  dwX As Long
  dwY As Long
  dwXSize As Long
  dwYSize As Long
  dwXCountChars As Long
  dwYCountChars As Long
  dwFillAttribute As Long
  dwFlags As Long
  wShowWindow As Integer
  cbReserved2 As Integer
  lpReserved2 As Long
  hStdInput As Long
  hStdOutput As Long
  hStdError As Long
End Type
Private Type PROCESS_INFORMATION
  hProcess As Long
  hThread As Long
  dwProcessID As Long
  dwThreadID As Long
End Type
 
'**********************************************************
' Описания для получения статуса клавиши
'----------------------------------------------------------
Public Enum VKeyEnum
  VK_SHIFT = &H10
  VK_CONTROL = &H11
  VK_LSHIFT = &HA0
  VK_RSHIFT = &HA1
  VK_LCONTROL = &HA2
  VK_RCONTROL = &HA3
End Enum
 
Private Declare Function GetKeyState Lib 'user32' (ByVal nVirtKey As Long) As Integer
Private Declare Function GetAsyncKeyState Lib 'user32' (ByVal vKey As Long) As Integer
 
'**********************************************************
' Запуск программы
'----------------------------------------------------------
Public Declare Function ShellExecute Lib 'shell32.dll' Alias 'ShellExecuteA' (ByVal hWnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
 
'**********************************************************
' Остановка процесса
'----------------------------------------------------------
Public Declare Sub Sleep Lib 'kernel32' (ByVal dwMilliseconds As Long)
 
'**********************************************************
' Установка приоритета текущего процесса
'----------------------------------------------------------
Public Sub SystemSetPriority(Priority As PriorityEnum)
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, можно попробовать мониторить подключения/отключения пользователей и файлы, открываемые ими. При таком раскладе отпадает необходимость что-либо ставить на коппьютере-источнике, но ошибки пропадания связи никак не отслеживаются.

В принципе, можно придумать еще чего-нибудь. Только думать напряжно
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.04.2011, 13:28
Помогаю со студенческими работами здесь

Принтер HP LJ1300 не выходит в готовность
Мигает желтый индикатор после включения принтера. Что делалось: Ставился новый картридж, проверка всех датчиков, перебирали полностью...

код, определяющий готовность диска к работе не работает
Дело такое: Иметтся несколько сетевых дисков, один из них Z: Мне нужно скопировать с него себе на комп какой то файл. Перед эти...

СМА Bosch WLF 20180 OE/01, уходит в готовность
Просьба проверить прошивку.Фишка вот в чем,после запуска на любом режиме в момент когда должен вкл.двигатель машинка переходит в готовность...

СМА BOSCH WOL2050EU SN485090222627000180, При запуске мигает или вообще не горит индикатор "готовность"
Добрый день. С неделю назад попала ко мне в ремонт выше указанная СМ в ремонт с симптомами - &quot;не включается&quot;. в процессе...

Как определить имя открываемого в системе файла, как антивирус
Как опредилить имя открываемого в системе фала как антивирусs&amp;


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу 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
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru