Как определить: существует ли определенный файл?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
vbStr
Новичок
Новичок
 
Сообщения: 44
Зарегистрирован: 04.04.2005 (Пн) 20:18

Как определить: существует ли определенный файл?

Сообщение vbStr » 19.07.2005 (Вт) 21:00

:?: Как определить: существует ли по определенному пути файл с некоторым именем? Можно ли решить эту проблему, не прибегая к обработке ошибки? Спасибо.



vbskb_file vbskb_exists vbskb_fileexists

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 19.07.2005 (Вт) 23:09

Код: Выделить всё
If Len(Dir("твой файл")) Then 'файл существует.

Это работает, но это неправильно.
Изображение

Leo!!!
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 19.07.2005 (Вт) 1:00

Сообщение Leo!!! » 20.07.2005 (Ср) 18:59

Поищи в поиске FSO
Нет ничего невозможного, но возможное тожэ огграничена и при этом нестоит забывать что свои вазможнасти человек ограничивает сам!

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 21.07.2005 (Чт) 8:00

tyomitch писал(а):
Код: Выделить всё
If Len(Dir("твой файл")) Then 'файл существует.

Это работает, но это неправильно.

Почему неправильно?
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 21.07.2005 (Чт) 8:09

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

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 21.07.2005 (Чт) 10:08

GSerg писал(а):Потому что файл могут удалить после того, как условие проверено, но до того, как начала выполняться ветка.

Тады как делать?
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 21.07.2005 (Чт) 10:19

Тады ловить ошибку, это единственно правильный способ.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 21.07.2005 (Чт) 16:13

GSerg писал(а):Тады ловить ошибку, это единственно правильный способ.

Но ловить ошибку уже после Len(dir...)?
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 21.07.2005 (Чт) 16:32

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

Gfif21
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 31.05.2004 (Пн) 7:23

Сообщение Gfif21 » 21.07.2005 (Чт) 16:42

Вот в книжице нашел примерчик:

Код: Выделить всё
Public Function bFileExists(sFile As String) As Boolean
    If Dir$(sFile) <> "" Then bFileExists = True Else _
    bFileExists = False
End Function

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 21.07.2005 (Чт) 16:43

Ты написанное выше читал?..
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Gfif21
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 71
Зарегистрирован: 31.05.2004 (Пн) 7:23

Сообщение Gfif21 » 21.07.2005 (Чт) 16:48

Ваапще-то нет :oops:

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 21.07.2005 (Чт) 19:20

GSerg писал(а):Потому что файл могут удалить после того, как условие проверено, но до того, как начала выполняться ветка.

Вообще-то я об этом даже не подумал :-)
Мой код (тот же самый, что в книжице Gfif21) неправильный потому, что если в Dir передать мусор, то он вернёт ошибку 52 "Bad file name or number", и её всё равно придётся отлавливать.
Но ты указал гораздо более серьёзный недостаток этого кода.
Изображение

extHack
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 94
Зарегистрирован: 04.06.2005 (Сб) 12:31
Откуда: 127.0.0.1

Сообщение extHack » 22.07.2005 (Пт) 17:00

if dir$("c:\windows\system32\ntoskrnl.exe") <> "" then
'Файл существует
else
'Не существует
end if
n/a

vbStr
Новичок
Новичок
 
Сообщения: 44
Зарегистрирован: 04.04.2005 (Пн) 20:18

Сообщение vbStr » 22.07.2005 (Пт) 17:02

Всем спасибо! Я так понял: без отлавливания ошибки не обойтись!

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 22.07.2005 (Пт) 17:22

extHack, ты тоже, да?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 22.07.2005 (Пт) 21:34

GSerg писал(а):extHack, ты тоже, да?


GSerg, покажи, плиз, пример реализации "правильного" кода. Что-то я не допру: как можно через дир проверить наличие файла и одновременно отловить ошибку. :(
Сделали дир - файл есть. Куда теперь? Если дальше - ты пишешь: не правильно. Если проверять ошибку - то какую? Которую вернёт дир? Когда? По второму разу дир делать? Я запутался.
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 23.07.2005 (Сб) 0:15

Можно так проверять:
Код: Выделить всё

Public Function bFileExists(sFile As String) As Boolean
    'Проверка наличия файла.
    'Подключить References -> Microsoft Scripting Runtime
    Dim f As New Scripting.FileSystemObject
    If f.FileExists(sFile) = True Then
        bFileExists = True
    Else
        bFileExists = False
    End If
End Function


To GSerg:
Если делать эту проверку сразу перед использованием файла, то вероятность того, что файл удалят раньше, чем он обработается в ветке будет очень маленькой. Хотя, конечно, стандартный ErrorHandler не помешает никогда.

FaKk2
El rebelde gur&#250;
El rebelde gur&#250;
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 23.07.2005 (Сб) 2:06

VVitafresh

Ты делаешь ставку на удачу. А GSerg делает наверняка.
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 23.07.2005 (Сб) 3:44

Ruslan Demidow писал(а):Сделали дир - файл есть. Куда теперь? Если дальше - ты пишешь: не правильно. Если проверять ошибку - то какую? Которую вернёт дир? Когда? По второму разу дир делать? Я запутался.

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

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 23.07.2005 (Сб) 8:35

GSerg писал(а):
Ruslan Demidow писал(а):Сделали дир - файл есть. Куда теперь? Если дальше - ты пишешь: не правильно. Если проверять ошибку - то какую? Которую вернёт дир? Когда? По второму разу дир делать? Я запутался.

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

А если мне в моей программе при загрузке нужно проверить наличие файла указанного в настройках, а использовать его потом (в зависимости от наличия файла). Всё равно писать обработчик?
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 23.07.2005 (Сб) 9:06

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

а самая надежная проверка - отлов ошибки.

Ruslan Demidow, Привет земляку!
Весь мир матрица, а мы в нем потоки байтов!

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 23.07.2005 (Сб) 10:11

!Viper! писал(а):Наличие файла надо проверять каждый раз при его использовании. Т.е. если надо проверить наличие указанного при загрузке файла, проверяй. Когда позже начинаешь с ним работать - проверяй... и так далее.

В принципе я так и делаю. У меня Public функция которая на входе получает имя файла и на выходе возвращает True/False в зависимости от наличия файла. Перед использованием вызываю её, и после этого сразу же идёт проверка результата этой функции. А там уже по обстоятельствам.

!Viper! писал(а):а самая надежная проверка - отлов ошибки.


Если в каждой процедуре или функции писать одни и те же строки проверки ошибки - это получается нерационально. В моём случае - эти строки вынесены в общедоступную функцию.
Как ещё можно отлавливать ошибки при доступе к файлу - мне представляется с трудом. Имхо, лучше проверить на наличие перед использованием, чем столкнуться с ошибкой во время использования (или в начале использования), там где и не расчитываешь на ошибку.

!Viper! писал(а):Ruslan Demidow, Привет земляку!

Привет! :D
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 23.07.2005 (Сб) 10:29

если просто проверить существование, то пожалуй дейтвительно лучше через Dir, и вынести это в отдельную функцию.

а если работаешь с файлом: открываешь, читаешь/пишешь/добавляешь, то на мой взгляд лучше в отдельные функции не лазить, а поместить весь код работы с файлом в обработчик ошибок. И обрабатывать возможные ошибки. Тут можно поймать и несуществование файла, и проблемы с доступом и все что может произойти с данным файлом. (И что не может тоже)

З.Ы. когда то написал на C чудную функцию определения существаования файла и пользовался ей в VB. где то она и шас лежит. надо поискать
Весь мир матрица, а мы в нем потоки байтов!

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 23.07.2005 (Сб) 21:46

Ruslan Demidow писал(а):
GSerg писал(а):
Ruslan Demidow писал(а):Сделали дир - файл есть. Куда теперь? Если дальше - ты пишешь: не правильно. Если проверять ошибку - то какую? Которую вернёт дир? Когда? По второму разу дир делать? Я запутался.

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

А если мне в моей программе при загрузке нужно проверить наличие файла указанного в настройках, а использовать его потом (в зависимости от наличия файла). Всё равно писать обработчик?
Может, не в тему, но приведу пример из жизни: есть такая штука - MTA (GTA по инету). Так вот, прога перед запуском GTA проверяет все файлы с настройками на валидность (чтобы никто не менял настройки, скажем, своих машин), а сама GTA сначала выдает заставку. Так вот, если во время заставки переключиться Alt+Tab'ом и все, что нужно, поменять, MTA ничего не скажет.
Вывод - все-таки лучше ловить ошибку, чем проверять наличие задолго до использования ;)
Нет меня больше

miwutka
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 76
Зарегистрирован: 10.11.2005 (Чт) 16:34
Откуда: Moscow, Elektrostal

Сообщение miwutka » 23.05.2006 (Вт) 11:32

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

если просто делать отлож ошибки при открытии файла?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 23.05.2006 (Вт) 11:47

miwutka писал(а):если просто делать отлож ошибки при открытии файла?

Так и надо.
Изображение

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 23.05.2006 (Вт) 12:08

tyomitch писал(а):Так и надо.

По разному бывает.
Например, программа работает с БД.
Если БД не существует, ее надо создать.
Если ты будешь открывать БД и отлавливать ошибку, то не всегда сможешь понять, из-за чего ошибка -- из-за отсутствующего файла БД или из-за поврежденной структуры.
Lasciate ogni speranza, voi ch'entrate.

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 23.05.2006 (Вт) 12:16

БД вряд ли будут открывать open file as number.

Ее скорее всего откроют провайдером. А он, вернет нужную ошибку - структура там кривая или еще что.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 23.05.2006 (Вт) 12:18

Провайдеры тоже бывают кривые :)
И фиг поймешь, что конкретно он подразумевает под возвращаемой ошибкой.
Lasciate ogni speranza, voi ch'entrate.

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 36

    TopList