Консультация № 146167
06.10.2008, 11:07
0.00 руб.
0 12 1
ситуация такая.
В расщаренной в сети папке лежит файл к примеру file.xls. Программно нужно определить занят ли этот файл каким либо процессом, без разнице с какого компьютера.
Спасибо

Обсуждение

давно
Профессионал
848
1596
06.10.2008, 11:56
общий
Пробуйте переименовать его
Name "file.xls" As "newfile.xls"
если возникает ошибка, то файл занят. Если переименовался - верните потом ему прежнее имя.
Неизвестный
06.10.2008, 13:57
общий
да, неплохой способя думал про него.
дело в том что работает медленно, с учетом того что файл далеко не один :)
Неизвестный
06.10.2008, 13:59
общий
я думал, может есть какая-нибудь API-функция
давно
Профессионал
848
1596
06.10.2008, 14:30
общий
Ну можно использовать CreateFile т.е. если файл существует будет ошибка.
Каквариант еще ипользовать Open
http://www.bbs.vbstreets.ru.postman.ru/viewtopic.php?f=1&t=36644
ваш вопрос
http://www.sql.ru/forum/actualthread.aspx?tid=231867
ток чет особ решений не вижу:-)
давно
Профессионал
848
1596
06.10.2008, 14:31
общий
Может еще чегонить найдете
Найти :-)
Неизвестный
06.10.2008, 14:56
общий
спасибо
Неизвестный
06.10.2008, 22:04
общий
Здравствуйте Pithon.
Мне кажется совет PsySex [06.10.2008, 13:56] оптимальный даже "...с учетом того что файл далеко не один..".
Код:
Function bFileFree(sNameFile As String) As Boolean
Const sTmp = "ssssssss"
Dim s As String
On Error Resume Next
Err.Clear
s = Mid(sNameFile, 1, Len(sNameFile) - Len(Dir(sNameFile)))
s = s + sTmp
Name sNameFile As s
Name s As sNameFile
If Err.Number = 0 Then bFileFree = True
End Function

Евгений
давно
Модератор
137394
1850
07.10.2008, 18:27
общий
это ответ
Здравствуйте, Pithon!
Макрос для Excel в приложении
Идея - пытаемся открыть файл. Если возникает ошибка с нужным номером (здесь 70) то файл занят.
Результат работы отображаю в клетке A1. Вы, естественно, построите программу, как Вам надо.
Если файл открывается без проблем, тут же его закрываем
В принципе, идею PsySex поминал, но (верьте мне, люди!) писал макрос, не прочтя пост в минифоруме. Жалко было написанное выбрасывать.
И, кроме того, у меня написано решение, а не идея.
Единственное, результат (т.к. это, в принципе, всего лишь иллюстрация решения) пишется в клетку A1 активного листа , так что будьте осторожны.



Приложение:
Sub yyy()


NF = "O:\DelDel\Книга1.xls" 'Имя файла

A = FreeFile()

On Error Resume Next
Open NF For Binary Lock Read As A

If Err <> 0 Then
Range("A1") = "Ошибка " & Err & ": " & Error(Err)
Else
Close A
Range("A1") = "Свободен "
End If


End Sub
Об авторе:
Понеже не словес красных бог слушает, но дел наших хощет
давно
Модератор
137394
1850
07.10.2008, 18:36
общий
Тесленко Евгений Алексеевич,
Вы считаете, что дважды переименовать файл быстрее (и безопаснее), чем один раз попытаться его открыть? (и закрыть, в случае если файл свободен)?
Об авторе:
Понеже не словес красных бог слушает, но дел наших хощет
Неизвестный
07.10.2008, 18:50
общий
Здравствуйте megaloman
"...с учетом того что файл далеко не один.." "...в сети..." быстрее - безусловно , безопаснее - ? (зависит от надежности сети)
давно
Модератор
137394
1850
07.10.2008, 21:32
общий
Добрый вечер, Тесленко Евгений Алексеевич!
А откуда такая уверенность? У меня на локальном диске получилось многократно быстрее открыть-закрыть. И по сети быстрее, но где-то, похоже, в методике у меня, возможно, баг, пока не осмыслил, утверждать не берусь с уверенностью.
Об авторе:
Понеже не словес красных бог слушает, но дел наших хощет
давно
Модератор
137394
1850
08.10.2008, 12:19
общий
Здравствуйте, Тесленко Евгений Алексеевич !

Предлагаю Вашему вниманию тестовый макрос, запускаемый из-под Excel
Применяемая методика:
В папке имеется 3000 файлов, которые я тестирую на занятость сначала методом открыть-закрыть, затем дважды переименовать
Тест делаю как на локальном диске, так и на сетевом. Оцениваю время выполнения.


Результат:

Локальный диск Open-Close 30 000 тестов (10*3000) за 3"
Локальный диск Name-Name 30 000 тестов (10*3000) за 34"

Сетевой диск Open-Close 9 000 тестов (3*3000) за 16"
Сетевой диск Name-Name 9 000 тестов (3*3000) за 99"

Не знаю, насколько методика корректна, попробуйте предложить свою. Но по предложенным тестам способ Open-Close ощутимо быстрее.
Но, с другой стороны, возможно тест и не имеет большого смысла. Зачем-то эти файлы нужны, например, чтобы их копировать. А вот этот процесс займёт времени много больше, чем тест на занятость по любой методике. И, опять же, при попытке копировать открытый файл можно тоже выловить событие, что файл занят.

С неизменным уважением, megaloman.

Код:
Sub yyy()

n_Files = 2999 ' Число файлов
n_Iter = 3 ' Число повторений


' ************************************************ Open-Close
Svo = 0
Zan = 0

Range("C11") = Time()

m = 0
A = FreeFile()

For j = 1 To n_Iter
For i = 0 To n_Files

'NF = "F:\DeleteEto\Файл_" & i & "." '& "xls" 'Имя файла на локальном диске
NF = "O:\DeleteEto\Файл_" & i & "." '& "xls" 'Имя файла на сетевом диске

On Error Resume Next
' Open NF For Random Lock Read As A
Open NF For Binary Lock Read As A

If Err <> 0 Then
' Range("L1").Offset(m, 0) = NF & " Ошибка " & Err & ": " & Error(Err)
m = m + 1
Zan = Zan + 1
Else
Close A
' Range("L1").Offset(m, 0) = NF
m = m + 1
Svo = Svo + 1
End If
Next
Next

Range("C12") = Time()
Range("C13") = Str(Svo) + " " + Str(Zan)

' *************************************************** Name-Name
Svo = 0
Zan = 0

Range("C14") = Time()
'TF = "F:\DeleteEto\TMP." ' Имя файла в который переименовываем на локальном диске
TF = "O:\DeleteEto\TMP." ' Имя файла в который переименовываем на сетевом диске

For j = 1 To n_Iter
For i = 0 To n_Files

'NF = "F:\DeleteEto\Файл_" & i & "." '& "xls" 'Имя файла на локальном диске
NF = "O:\DeleteEto\Файл_" & i & "." '& "xls" 'Имя файла на сетевом диске

On Error Resume Next
Name NF As TF

If Err <> 0 Then
Zan = Zan + 1
Else
Name TF As NF
Svo = Svo + 1
End If
Next
Next

Range("C15") = Time()
Range("C16") = Str(Svo) + " " + Str(Zan)

End Sub
Об авторе:
Понеже не словес красных бог слушает, но дел наших хощет
Форма ответа