Модуль не читает длинные имена

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

Модуль не читает длинные имена

Сообщение VERITAS » 28.12.2004 (Вт) 23:33

Здраствуйте люди!

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

':::::::::Module:::::::::

' пример использования
' If IsFileExists("Ваш файл") Then MsgBox ""

Option Explicit
Public Declare Function GetAsyncKeyState Lib "User32.dll" (ByVal Key As Long) As Integer

'Вызываем API
Public Declare Function OpenFile Lib "Kernel32.dll" _
(ByVal lpFileName As String, lpReOpenBuff As OpenFileProperties, _
ByVal wStyle As Long) As Long

Public Const BIF_RETURNONLYFSDIRS = 1
Public Const MAX_PATH = 260
Public Const HH_HELP_CONTEXT = &HF

'Тип данных для API
Public Type OpenFileProperties
cBytes As Byte
fFixedDisk As Byte
nErrCode As Integer
Reserved1 As Integer
Reserved2 As Integer
szPathName(500) As Variant
End Type

Public Function IsFileExists(ByVal ExistsFileName As String) As Boolean
On Error Resume Next
Dim OpenFP As OpenFileProperties
Dim Temp As String

Temp = OpenFile(ExistsFileName, OpenFP, &H4000)
If Temp = 1 Then
IsFileExists = True
Else
IsFileExists = False
End If
End Function

Public Function GetKeyState(StateKayAscii As Integer) As Boolean
On Error Resume Next
Dim GetKeyStateTemp As Long
GetKeyStateTemp = GetAsyncKeyState(StateKayAscii)
If GetKeyStateTemp <> 0 Then
GetKeyState = True
Else
GetKeyState = False
End If
End Function

'::::::END MODULE::::::
Заранее всем спасибо за оказанную помощь! :!:
No comments ...

xolod
Гуру
Гуру
 
Сообщения: 1162
Зарегистрирован: 15.01.2004 (Чт) 0:42
Откуда: Moscow

Сообщение xolod » 28.12.2004 (Вт) 23:45

Позволю себе предложить замену твоей маленькой ф-ции на свою
Код: Выделить всё
Public Function Files_Exists(ByVal FilePath As String) As Boolean
  On Error Resume Next
  If (Trim$(FilePath) = "") Then Exit Function
  If Right$(FilePath, 1) = "\" Then
    Files_Exists = (Len(Dir(FilePath, vbDirectory)) > 0)
  Else
    Files_Exists = (Len(Dir(FilePath)) > 0)
  End If
End Function


притом, если укажешь директорию (к конце символ '\'), ф-ция проверит существование именно директории, а если файл - файла :arrow:

Constant ERROR_SUCCESS deprecated. I'm so happy.
Программирование и дизайн – http://www.macrointellect.ru

|kerish|
Постоялец
Постоялец
 
Сообщения: 831
Зарегистрирован: 22.10.2004 (Пт) 0:31

Сообщение |kerish| » 28.12.2004 (Вт) 23:48

Позволю себе предложить замену на одну строчку.
Код: Выделить всё
If Dir("C:\Путь_к_файлу.txt") <> "" Then MsgBox "Файл существует."

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

Сообщение tyomitch » 29.12.2004 (Ср) 0:01

Позволю себе заметить, что Dir выдаёт ошибку для невалидного пути (например ":"), и её надо обрабатывать.
Изображение

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

Сообщение A.A.Z. » 29.12.2004 (Ср) 0:05

Код: Выделить всё
On Error GoTo ErrHandle
Dim FF&
FF = FreeFile()
Open "Z:\Bla.bla" For Input As #FF: Close #FF
MsgBox "Файл есть!"
Exit Sub
ErrHandle:
If Err.Number = 53 Then MsgBox "Файла нет!"
Супер способ! :lol:
[edit]Пока я писал этот пост, tyomitch успел исправить свой =)[/edit]

VERITAS
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 212
Зарегистрирован: 12.12.2004 (Вс) 20:31

Сообщение VERITAS » 29.12.2004 (Ср) 0:10

xolod , |kerish|, tyomitch & A.A.Z. - Большое спасибо, теперь все Окей! :)
Последний раз редактировалось VERITAS 29.12.2004 (Ср) 0:47, всего редактировалось 1 раз.
No comments ...

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

Сообщение A.A.Z. » 29.12.2004 (Ср) 0:21

Всегда пожалуйста! Изображение
ЗЫ вот только Тёмыча надо было правильно написать ;)

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

Сообщение tyomitch » 29.12.2004 (Ср) 0:34

A.A.Z. писал(а):[edit]Пока я писал этот пост, tyomitch успел исправить свой =)[/edit]
:lol:

На самом деле, а если файл существует, но недоступен для чтения (например, тот же своп) - тогда твой способ ошибётся.
Изображение

CodeName33
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 297
Зарегистрирован: 01.09.2004 (Ср) 13:25
Откуда: SPb

Сообщение CodeName33 » 29.12.2004 (Ср) 15:04

А так, не должен ошибаться:

Private Declare Function GetFileAttributes Lib "kernel32" Alias "GetFileAttributesA" (ByVal lpFileName As String) As Long

Public Function CheckFile(Name As String) As Integer
Dim S As Long
S = GetFileAttributes(Name)
If S = -1 Then CheckFile = 0: Exit Function
If S And &H10 Then CheckFile = 2: Exit Function
CheckFile = 1
End Function

' 0 - нет, 1 - файл, 2 - папка.
Программисты не глючат - глючат компиляторы...


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

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

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

    TopList