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

Как проверить существует ли файл // папка

17.01.2014, 16:47. Показов 7404. Ответов 29
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как проверить существует ли файл // папка

Раньше я использовал библиотеку Scripting
и классы FileSystemObject (FSO) и Dictionary (Dic)
так вот, можно обойтись без них )


Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
 
Public Function FileExists(ByVal PathName$) As Boolean
    'Возврат утверждения наличия файла
    On Error Resume Next
    FileExists = GetAttr(PathName) And Err = 0
End Function
 
Public Function FolderExists(ByVal PathName$) As Boolean
    'Возврат утверждения наличия папки
    On Error Resume Next
    FolderExists = GetAttr(PathName) And Err = 0
End Function
Проверить можно так:
Visual Basic
1
2
3
4
5
6
 Private Sub Form_Load()
    Dim s$
    s = Environ("homepath")
    MsgBox FolderExists(s)
    End
End Sub
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.01.2014, 16:47
Ответы с готовыми решениями:

Как можно программно проверить: существует ли файл по указанному пути?
Как можно программно проверить: существует ли файл по указанному пути? Спасибо, ZandR

Проверить, существует ли каталог, и если не существует - создать
Как средствами VB6 проверить существует ли каталог, и если не существует - создать? DName$ =...

Как проверить существует ли лист Excel c определенным названием
Пишу вторую в жизни программу на VB - макрос для Excel В цикле перебираются по очереди все листы...

Как проверить, существует ли папка?
Как проверить есть ли Каталог E2E2~1 По средствам С++ Builder?

29
Апострофф
17.01.2014, 21:03
  #2

Не по теме:

FelixMacintosh, Вас не смущает одинаковость кодов для папок и для файлов?
Результат, возвращаемый ф-ией GetAttr надо проанализировать хотя бы...

0
Заблокирован
17.01.2014, 21:57  [ТС] 3

Не по теме:

Нет не смущает, потому что при любом неправилном
вводе пути, возникнет ошибка, которая и будет результатом )



Добавлено через 26 минут
вообще-то можно было написать даже одну функцию PathExists
0
Заблокирован
17.01.2014, 21:59 4
FelixMacintosh, проверьте на реальном пути к файлу (папке) обе ваши ф-ии.
Обе вернут Yes.
А ведь интересует чаще всего что то конкретное - либо файл, либо папка.
0
Заблокирован
17.01.2014, 22:11  [ТС] 5
хотя мне уже и подсказали еще более простой вариант такого решения

Добавлено через 1 минуту
в другой теме

Добавлено через 10 минут
здесь Запись текста в файл (txt или ini) из TextBox
признаю что мой алгоритм не был обдуман, и отправлен в готовые решения )
1
2618 / 548 / 109
Регистрация: 21.03.2012
Сообщений: 1,051
18.01.2014, 22:06 6
FelixMacintosh, чем не устраивает библиотечная функция Dir()?
Кстати, упомянутый в первом сообщении объект Dictionary к проверке корректности пути не имеет никакого отношения.
0
Заблокирован
18.01.2014, 22:38  [ТС] 7
Цитата Сообщение от Dmitrii Посмотреть сообщение
сообщении объект Dictionary к проверке корректности пути не имеет никакого отношения.
Понимаю вашу озабоченность
тут дело в том что я группу контролов делаю, мы тут с пользователем The Trick - ом
всем уже наверное надоели с этим )
так вот, в своих контролах мне рекомендовали полностью отказаться от дополнительных библиотек, тоесть Dictionary там у меня играет роль быстрого сопоставления по ключу
чтоб и от неё отказаться как и от всей библиотеки Scripting Runtime в дальнейшем
я буду применять коллекции, кстате уже делаю, а тот компонент который я выложил, работает, но уже по моему, так-сказать устарел

Добавлено через 6 минут
я бы уже сегодня выложил, то чего добиваюсь,
только у меня с компом проблемы, видюха отказала, пол дня с видеокартой разбирался
0
Модератор
9724 / 3685 / 871
Регистрация: 22.02.2013
Сообщений: 5,530
Записей в блоге: 78
18.01.2014, 22:42 8
Цитата Сообщение от Dmitrii Посмотреть сообщение
FelixMacintosh, чем не устраивает библиотечная функция Dir()?
Цитата Сообщение от FelixMacintosh Посмотреть сообщение
хотя мне уже и подсказали еще более простой вариант такого решения Запись текста в файл (txt или ini) из TextBox
Цитата Сообщение от FelixMacintosh Посмотреть сообщение
я буду применять коллекции
Применяй сразу массив, как я тебе советовал.
0
Заблокирован
20.01.2014, 19:56  [ТС] 9
Цитата Сообщение от Апострофф Посмотреть сообщение
Обе вернут Yes.
А ведь интересует чаще всего что то конкретное - либо файл, либо папка.
Уважаемый The Trick и ваш пример из этого поста тоже в обоих случаях вернёт Yes

вот как надо было !
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Public Function FileExists(FileName$) As Boolean
    Dim n&
    On Error Resume Next
    n = GetAttr(FileName)
    FileExists = (n And vbDirectory) = 0 And n
End Function
 
Public Function FolderExists(FolderName$) As Boolean
    Dim n&
    On Error Resume Next
    n = GetAttr(FolderName)
    FolderExists = n And vbDirectory
End Function
Добавлено через 11 минут
Я почему это заметил, потому-что сейчас весь свой проект переделываю
2
Модератор
9724 / 3685 / 871
Регистрация: 22.02.2013
Сообщений: 5,530
Записей в блоге: 78
20.01.2014, 21:01 10
Цитата Сообщение от FelixMacintosh Посмотреть сообщение
вот как надо было !
Зачем так?
Visual Basic
1
2
3
4
5
6
7
8
9
10
    ' Ïðîâåðêà ñóùåñòâîâàíèÿ ïàïêè
    If Len(Dir("D:\Temp", vbDirectory)) Then
        If GetAttr("D:\Temp") = vbDirectory Then
        ' Ïàïêà ñóùåñòâóåò
        Else
        ' Ïàïêè íå ñóùåñòâóåò
        End If
    Else
        ' Ïàïêè íå ñóùåñòâóåò
    End If
2
Антихакер32
20.01.2014, 21:21  [ТС]
  #11

Не по теме:

У меня лучше :p

0
Заблокирован
20.01.2014, 21:49 12
Лучший ответ Сообщение было отмечено The trick как решение

Решение

Цитата Сообщение от The trick Посмотреть сообщение
Visual Basic
1
2
If GetAttr("D:\Temp") = vbDirectory Then
* * * * ' Папка существует
А папки (и файлы) бывают и скрытые, и системные...
Visual Basic
1
2
3
4
5
6
7
8
9
If Len(Dir("D:\Temp", 63)) Then
  If GetAttr("D:\Temp") And vbDirectory Then
  ' Папка существует
  ElseIf (GetAttr("D:\Temp") And vbDirectory) = 0 Then
  ' Файл существует
  End If
Else
    ' Имя не занято
End If
1
Заблокирован
20.01.2014, 22:03  [ТС] 13

Не по теме:

Ну вот... и я о том же...



Добавлено через 3 минуты
Только я предусмотрел если вместо пути, пользователь введёт что-то другое
поэтому предусмотрел обработчик ошибки, скоро покажу свой супер проект...
0
Модератор
9724 / 3685 / 871
Регистрация: 22.02.2013
Сообщений: 5,530
Записей в блоге: 78
20.01.2014, 22:41 14
Цитата Сообщение от Апострофф Посмотреть сообщение
А папки (и файлы) бывают и скрытые, и системные..
Согласен. А вообще если делать на все случаи, то делать тогда поддержку юникода в именовании.
0
Заблокирован
20.01.2014, 22:54  [ТС] 15
Это чтоб можно было вводить имена файлов и папок, на китайском )

Добавлено через 7 минут
да и не только на китайском
такой символ © уже наверное не поставить в имени...

Добавлено через 1 минуту
или такой ✭ ✮ ✭ ✮ ✭ ✮
0
Модератор
9724 / 3685 / 871
Регистрация: 22.02.2013
Сообщений: 5,530
Записей в блоге: 78
20.01.2014, 23:00 16
FelixMacintosh, это не только для таких имен файлов, например в Windows, где установлен другой язык системы, ты возможно не сможешь открыть файлы с именами на русском языке. Поэтому часто бывают проблемы в программах, где имеются кириллица в именах файлов. Вот пример, когда стандартные функции не работают
0
Заблокирован
20.01.2014, 23:06  [ТС] 17
Хотя и Windows тоже не видит эти символы ...✭ ✮ ✭
а то что видит, и моя прога видит тоже )
Миниатюры
Как проверить существует ли файл // папка   Как проверить существует ли файл // папка  
0
Антихакер32
21.01.2014, 10:24  [ТС]
  #18

Не по теме:

кстате я нашол способ как находить ответы строго на определённом ресурсе
для этого в строке поиска пишем следующий пример
site:https://www.cyberforum.ru/ как проверить существует ли файл папка

таким же способом можно вызвать раздел - подраздел, любой другой ресурс )
site:http: пишеться без пробелов

Добавлено через 9 минут
Очень удобно, можно сказать что я открыл для себя Google заново

моментально нашол ответ, даже как это реализовать батником )

0
Модератор
9724 / 3685 / 871
Регистрация: 22.02.2013
Сообщений: 5,530
Записей в блоге: 78
21.01.2014, 11:09 19
Лучший ответ Сообщение было отмечено The trick как решение

Решение

Вот аналог, Vb-шного Dir'a, только с поддержкой юникодных имен файлов
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
Option Explicit
 
Private Const MAX_PATH = 260
 
Private Type FILETIME
    dwLowDateTime As Long
    dwHighDateTime As Long
End Type
Private Type WIN32_FIND_DATA
    dwFileAttributes As Long
    ftCreationTime As FILETIME
    ftLastAccessTime As FILETIME
    ftLastWriteTime As FILETIME
    nFileSizeHigh As Long
    nFileSizeLow As Long
    dwReserved0 As Long
    dwReserved1 As Long
    lpszFileName(MAX_PATH) As Integer
    lpszAlternate(14) As Integer
End Type
 
Private Const FILE_ATTRIBUTE_NORMAL As Long = &H80
Private Const INVALID_HANDLE_VALUE As Long = -1
 
Private Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileW" (ByVal lpFileName As Long, lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileW" (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) As Long
Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenW" (ByVal lpString As Long) As Long
Private Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyW" (ByVal lpString1 As Long, ByVal lpString2 As Long) As Long
 
 
Public Function DirW(Optional ByVal Path As String, Optional Flags As VbFileAttribute = vbNormal) As String
    Dim fd As WIN32_FIND_DATA, lpStr As Long, lRet As Long, l As Long
    Static hFind As Long, lFlags As VbFileAttribute
    
    If hFind <> 0 And Len(Path) = 0 Then
        If FindNextFile(hFind, fd) = 0 Then FindClose hFind: hFind = 0: Exit Function
    Else
        If hFind Then FindClose hFind: hFind = 0
        Path = Trim(Path)
        lFlags = Flags
        lpStr = StrPtr(Path)
        Select Case Right$(Path, 1)
        Case "\", ":", "/"
            Path = Path & "*.*"
        End Select
        hFind = FindFirstFile(StrPtr(Path), fd)
        If hFind = INVALID_HANDLE_VALUE Then hFind = 0: Err.Raise 52: Exit Function
    End If
 
    l = ((fd.dwFileAttributes = FILE_ATTRIBUTE_NORMAL) + 1) * fd.dwFileAttributes
    l = l And (Not lFlags)
    l = l And &H16&
    
    Do While l
        If FindNextFile(hFind, fd) = 0 Then FindClose hFind: hFind = 0: Exit Function
        l = ((fd.dwFileAttributes = FILE_ATTRIBUTE_NORMAL) + 1) * fd.dwFileAttributes
        l = l And (Not lFlags)
        l = l And &H16&
    Loop
    
    lpStr = VarPtr(fd.dwReserved1) + 4
    l = lstrlen(lpStr)
    DirW = String$(l, vbNullChar)
    lRet = StrPtr(DirW)
    lstrcpy lRet, lpStr
End Function
Соответственно результат
Миниатюры
Как проверить существует ли файл // папка  
2
Заблокирован
21.01.2014, 11:37  [ТС] 20
Спасибо The Trick,

тоесть заместо Dir я могу смело воспользоваться Вашей DirW ?

Добавлено через 14 минут
И абсолютный путь в юникоде тоже можно получить ?

пример: ..\..\..\✭ ✮ ✭.txt
0
21.01.2014, 11:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.01.2014, 11:37
Помогаю со студенческими работами здесь

Как проверить, существует ли папка на диске?
Какая команда позволяет проверить (сравнить), существует ли папка по указанному пути на диске, и...

Проверить, существует ли папка
Господа, как проверить, существует ли папка? Про PathFileExists я знаю, но A path specified by...

Проверить существует ли папка
Помогите! Мне надо сделать так чтоб папка создавалась если ее нет! а я незнаю как проверить есть ли...

Проверить существует папка
Нужно сделать проверку на существование папки , если нет то создать её .


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru