Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File 检查文件是否存在时出现错误53_File_Vb6_Dir - Fatal编程技术网

File 检查文件是否存在时出现错误53

File 检查文件是否存在时出现错误53,file,vb6,dir,File,Vb6,Dir,我使用以下代码检查文件是否存在: If Len(Dir$(strFile)) > 0 Then 直到今天,这一切都很顺利 在某些情况下,我会出现以下错误: 错误指向上面的代码行 我知道该文件不存在,但我不希望出现此错误。我忘了提到一点:文件名是动态的,取决于另一个进程 我刚刚注意到,当错误发生时,另一个进程返回垃圾,导致文件名长约2000个字符 我从未意识到文件名的长度是有限制的 我创建了一个小项目来测试这一点,结果发现上限是259个字符: Option Explicit Priva

我使用以下代码检查文件是否存在:

If Len(Dir$(strFile)) > 0 Then
直到今天,这一切都很顺利

在某些情况下,我会出现以下错误:

错误指向上面的代码行


我知道该文件不存在,但我不希望出现此错误。

我忘了提到一点:文件名是动态的,取决于另一个进程

我刚刚注意到,当错误发生时,另一个进程返回垃圾,导致文件名长约2000个字符

我从未意识到文件名的长度是有限制的

我创建了一个小项目来测试这一点,结果发现上限是259个字符:

Option Explicit

Private Sub Command1_Click()
  Dim strFile As String
  Dim intLength As Integer
  strFile = App.Path & "\"
  intLength = 259 - Len(strFile)
  strFile = strFile & String(intLength, "a")
  If Len(Dir$(strFile)) = 0 Then
    MsgBox "file does not exist"
  End If
End Sub

使用值259可以正常工作,但260会产生错误。

我忘了提到一点:文件名是动态的,取决于另一个进程

我刚刚注意到,当错误发生时,另一个进程返回垃圾,导致文件名长约2000个字符

我从未意识到文件名的长度是有限制的

我创建了一个小项目来测试这一点,结果发现上限是259个字符:

Option Explicit

Private Sub Command1_Click()
  Dim strFile As String
  Dim intLength As Integer
  strFile = App.Path & "\"
  intLength = 259 - Len(strFile)
  strFile = strFile & String(intLength, "a")
  If Len(Dir$(strFile)) = 0 Then
    MsgBox "file does not exist"
  End If
End Sub

使用值259可以正常工作,但260会产生错误。

我使用一个调用Windows API的函数来实现这一点。此函数用于处理空格和长文件名

在声明部分添加:

Private Declare Function CloseHandle Lib "Kernel32" (ByVal hObject As Long) As Long
Private Declare Function CreateFile Lib "Kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As SECURITY_ATTRIBUTES, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Any) As Long

Private Type SECURITY_ATTRIBUTES
    nLength As Long
    lpSecurityDescriptor As Long
    bInheritHandle As Long
End Type

Private Const OPEN_EXISTING = 3
Private Const FILE_SHARE_READ = &H1
Private Const GENERIC_READ = &H80000000
Private Const INVALID_HANDLE_VALUE = -1
实际功能

Function FileExists(ByVal fSpec As String) As Boolean
    Dim lngResult As Long
    Dim udtSA As SECURITY_ATTRIBUTES

    On Error GoTo errFileExists

    If Len(fSpec) > 0 Then
        udtSA.nLength = Len(udtSA)
        udtSA.bInheritHandle = 1&
        udtSA.lpSecurityDescriptor = 0&
        lngResult = CreateFile(fSpec, GENERIC_READ, FILE_SHARE_READ, udtSA, OPEN_EXISTING, 0&, 0&)
        If lngResult <> INVALID_HANDLE_VALUE Then
            Call CloseHandle(lngResult)
            FileExists = True
        Else
            Select Case Err.LastDllError  'some errors may indicate the file exists, but there was an error opening it
                Case Is = ERROR_SHARING_VIOLATION
                    FileExists = True

                Case Else
                    FileExists = False

            End Select
        End If
   End If

Exit Function

errFileExists:
    Err.Raise Err.Number, Err.Source, Err.Description, Err.HelpFile, Err.HelpContext

End Function
函数文件以布尔形式存在(ByVal fSpec作为字符串)
暗淡的结果和长的一样
将udtSA设置为安全属性
出现错误时转到errFileExists
如果Len(fSpec)>0,则
udtSA.nLength=Len(udtSA)
udtSA.bInheritHandle=1&
udtSA.lpSecurityDescriptor=0&
lngResult=CreateFile(fSpec、通用读取、文件共享读取、udtSA、打开现有、0&、0&)
如果lngResult的句柄值无效,则
调用CloseHandle(lngResult)
FileExists=True
其他的
Select Case Err.LastDllError'某些错误可能表明文件存在,但打开文件时出错
案例为=错误\共享\违规
FileExists=True
其他情况
FileExists=False
结束选择
如果结束
如果结束
退出功能
错误文件存在:
Err.Raise Err.Number、Err.Source、Err.Description、Err.HelpFile、Err.HelpContext
端函数

我使用一个调用Windows API的函数来实现这一点。此函数用于处理空格和长文件名

在声明部分添加:

Private Declare Function CloseHandle Lib "Kernel32" (ByVal hObject As Long) As Long
Private Declare Function CreateFile Lib "Kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As SECURITY_ATTRIBUTES, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Any) As Long

Private Type SECURITY_ATTRIBUTES
    nLength As Long
    lpSecurityDescriptor As Long
    bInheritHandle As Long
End Type

Private Const OPEN_EXISTING = 3
Private Const FILE_SHARE_READ = &H1
Private Const GENERIC_READ = &H80000000
Private Const INVALID_HANDLE_VALUE = -1
实际功能

Function FileExists(ByVal fSpec As String) As Boolean
    Dim lngResult As Long
    Dim udtSA As SECURITY_ATTRIBUTES

    On Error GoTo errFileExists

    If Len(fSpec) > 0 Then
        udtSA.nLength = Len(udtSA)
        udtSA.bInheritHandle = 1&
        udtSA.lpSecurityDescriptor = 0&
        lngResult = CreateFile(fSpec, GENERIC_READ, FILE_SHARE_READ, udtSA, OPEN_EXISTING, 0&, 0&)
        If lngResult <> INVALID_HANDLE_VALUE Then
            Call CloseHandle(lngResult)
            FileExists = True
        Else
            Select Case Err.LastDllError  'some errors may indicate the file exists, but there was an error opening it
                Case Is = ERROR_SHARING_VIOLATION
                    FileExists = True

                Case Else
                    FileExists = False

            End Select
        End If
   End If

Exit Function

errFileExists:
    Err.Raise Err.Number, Err.Source, Err.Description, Err.HelpFile, Err.HelpContext

End Function
函数文件以布尔形式存在(ByVal fSpec作为字符串)
暗淡的结果和长的一样
将udtSA设置为安全属性
出现错误时转到errFileExists
如果Len(fSpec)>0,则
udtSA.nLength=Len(udtSA)
udtSA.bInheritHandle=1&
udtSA.lpSecurityDescriptor=0&
lngResult=CreateFile(fSpec、通用读取、文件共享读取、udtSA、打开现有、0&、0&)
如果lngResult的句柄值无效,则
调用CloseHandle(lngResult)
FileExists=True
其他的
Select Case Err.LastDllError'某些错误可能表明文件存在,但打开文件时出错
案例为=错误\共享\违规
FileExists=True
其他情况
FileExists=False
结束选择
如果结束
如果结束
退出功能
错误文件存在:
Err.Raise Err.Number、Err.Source、Err.Description、Err.HelpFile、Err.HelpContext
端函数

+1用于回答自己的问题和坚持。至于magic
260
,很可能是
Dir$()
点击了
MAX\u PATH
限制:啊,谢谢!确实如此。如果他们提供了除“未找到文件”之外的另一个错误,那就太好了:@Hrqls我怀疑VB运行时只是将文件字符串中的260个字符复制到一个260个字符的缓冲区中(即大小为MAX_PATH),从而隐式地将文件名截断为259个字符(包括空终止符)。毫不奇怪,该文件不存在。@MarkBertenshaw我的代码行在那里检查该文件是否存在。它适用于现有和不存在文件的较短文件名。因此,它不只是返回0,而是给出了一个错误“找不到文件”,而“文件名太长”会更好:)+1用于回答自己的问题和持久性。至于magic
260
,很可能是
Dir$()
点击了
MAX\u PATH
限制:啊,谢谢!确实如此。如果他们提供了除“未找到文件”之外的另一个错误,那就太好了:@Hrqls我怀疑VB运行时只是将文件字符串中的260个字符复制到一个260个字符的缓冲区中(即大小为MAX_PATH),从而隐式地将文件名截断为259个字符(包括空终止符)。毫不奇怪,该文件不存在。@MarkBertenshaw我的代码行在那里检查该文件是否存在。它适用于现有和不存在文件的较短文件名。因此,它不只是返回0,而是给出了一个错误“找不到文件”,而“文件名太长”会更好:)