例子代码:判断文件/目录存在

时间:2021-05-23 18:53:49

Private Const MAX_PATH As Long = 260

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
   cFileName As String * MAX_PATH
   cAlternate As String * 14
End Type

Private Declare Function FindClose Lib "kernel32" _
  (ByVal hFindFile As Long) As Long

Private Declare Function FindFirstFile Lib "kernel32" _
   Alias "FindFirstFileA" _
  (ByVal lpFileName As String, _
   lpFindFileData As WIN32_FIND_DATA) As Long

Private Const FILE_ATTRIBUTE_DIRECTORY = &H10

Private Const INVALID_HANDLE_VALUE = -1



Public Function IsFileExists(sFileName As String) As Boolean
    
    Dim f%
    
    On Error GoTo handleError
    
    If sFileName <> "" Then
        f% = FreeFile
        Open sFileName For Input As #f%
        Close #f%
        
        IsFileExists = True
    Else
        IsFileExists = False
    End If
    
    Exit Function
    
handleError:
    IsFileExists = False
    
End Function


Public Function DoesFileExistEx(ByVal sFile As String) As Boolean
    
    Dim FindData As WIN32_FIND_DATA
    Dim GetFile As Long
       
    GetFile = FindFirstFile(sFile, FindData)
        
    If GetFile <> INVALID_HANDLE_VALUE Then
        If (FindData.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY) Then
            DoesFileExistEx = False '目录
        Else
            DoesFileExistEx = True
        End If
    Else
        DoesFileExistEx = False
    End If
    
    FindClose GetFile
 
End Function


Public Function DoesFolderExistEx(ByVal sFile As String) As Boolean
    
    Dim FindData As WIN32_FIND_DATA
    Dim GetFile As Long
       
    GetFile = FindFirstFile(sFile, FindData)
        
    If GetFile <> INVALID_HANDLE_VALUE Then
        If (FindData.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY) Then
            DoesFolderExistEx = True '目录
        Else
            DoesFolderExistEx = False
        End If
    Else
        DoesFolderExistEx = False
    End If
    
    FindClose GetFile
 
End Function


26 个解决方案

#1


边抢分,边学习!!!
好好学习,天天向上!!!

#2


收藏

#3


hehe

#4


????

#5


楼上有什么问题吗?

#6


学习

#7



这样处理是是在滥用VB!!!!!!!!!!!!!!

VB的dir函数很好用

dir(pathname,16),就可以判断目录是否存在 (返回空值就不存在)
dir(pathname,0),就可以判断文件是否存在 (返回空值就不存在)
根本不需要那么多行,还居然用到了API?!
另外,使用错误处理来文件是否存在这样简单的问题是程序设计中
的非常非常坏的习惯。

#8


楼上的朋友说的没错,Dir函数既简单又有效,和不用之

#9


dir就行了,

#10


to: tuppin(熊王)
  
如果按照你的方法,

◇首先:
标准的vbDirectory放着不用,要硬编码使用16?
标准的vbNormal放着不用,要硬编码使用0?
如果vb改变了常量值,你的代码不是要改么?

◇其次,
你判断的是给定目录的属性“是”vbDirectory(目录)
我这里判断是给定目录的属性“有”vbDirectory(目录)
当目录含有不只一个属性,如隐藏、系统等其它属性的时候,你的判断是不全面的。

详细请参考:
关于判断文件/文件夹是否存在:
http://www.csdn.net/expert/topic/375/375537.xml


不经过认真测试和学习,而来否定别人的方法,才是非常坏的习惯吖!

我纯粹是在讨论技术,别在意。

#11


等一下来结帖子

#12


也可以用写文件再删除文件,然后捕捉错误的方法 不过不好

#13


不错

#14


真好:)

#15


而且,使用API是为了“更加肯定地”返回正确结果。

我并不是不想用现成的内置函数,只不过,有些时候,内置函数不大能胜任,我就选择使用API了。这是个人做法问题,您可以按照自己的实际情况使用您喜欢的方法。

谢谢参与讨论。

#16


而且,使用API是为了“更加肯定地”返回正确结果。

我并不是不想用现成的内置函数,只不过,有些时候,内置函数不大能胜任,我就选择使用API了。这是个人做法问题,您可以按照自己的实际情况使用您喜欢的方法。

谢谢参与讨论。

#17


Public Declare Function PathFileExists Lib "shlwapi.dll" Alias "PathFileExistsA" (ByVal lpszPath As String) As Long


Public Declare Function PathIsDirectory Lib "shlwapi.dll" Alias "PathIsDirectoryA" (ByVal lpszPath As String) As Long



If PathFileExists(<文件名>) <> 0 And PathIsDirectory(<文件名>) = 0 Then 文件存在。



PathFileExists 判断文件、目录是否存在,PathIsDirectory 判断目录是否存在。返回非零值表示存在。上面的判断语句判断<文件名>是否存在,并且确认它不是目录。



系统兼容性:


Windows NT/2000: Requires Windows 2000 (or Windows NT 4.0 with Internet Explorer 4.0 or later). 


Windows 95/98/Me: Requires Windows 98 (or Windows 95 with Internet Explorer 4.0 or later). 

#18


致enmity (灵感之源) 

我用0和16只是想描述简单一些,主要目的不是讨论编程风格,而是讨论实现技术。

dir的第二个参数包含了隐藏,只读,系统等等属性,
0也好,16也好,它们都是2的指数,
这种属性值可以“或”在一起用。

在请你告诉我,就判断一个Pathname到底是文件还是目录,是存在还是不存在这个问题,Dir如何作不到?dir又如何不能给出一个更加肯定的结果呢?
同样使用DIR,就以你给出的三个函数的入口和返回值为标准,写出的代码一定
比你的短和可靠,同时更易读,你相信吗?

我并不反对使用API,在我的程序中只有万不得以才使用,否则直接用C/C++好了,
干嘛用VB.

#19


致enmity (灵感之源) 

我用0和16只是想描述简单一些,主要目的不是讨论编程风格,而是讨论实现技术。

dir的第二个参数包含了隐藏,只读,系统等等属性,
0也好,16也好,它们都是2的指数,
这种属性值都是各占1bit,可以“或”在一起用。

在请你告诉我,就判断一个Pathname到底是文件还是目录,
是存在还是不存在这个问题,Dir()如何作不到?
dir()又如何不能给出一个更加肯定的结果呢?

同样使用DIR(),就以你给出的三个函数的入口和返回值为标准,
(如果你要求更多的功能,就没法讨论了)
写出的代码一定比你的短和可靠,同时更易读,你相信吗?


我并不反对使用API,在我的程序中只有万不得以才使用,否则直接用C/C++好了。



#20


不错。。。。。CSDN就是要有这样的好人

各位高手,得了吧,人家不是出题让你们来挑毛病的,任何一个方法都不可能尽善,想得太多的话,就什么也别做了,点到为止!!!

这里讨论的是实现问题,不是怎么实现更好的问题,

打个比方说:明明知道坐飞机可以到美国,我偏偏要用筋斗云,俺老孙

玩的就是这个。。。。。。。。。。。。。。。。。。。。

你们这样会打消人家的积极性的!!!

唉!!!

总有人。。。。。。。。

#21


喜欢抬杠。。。。。。。。。。。。。

#22


好好学习,天天向上
你的比方不恰当,应该是明明坐飞机可以到美国,偏要说先
坐火车到俄罗斯,然后作破冰船过白令海峡,还得作一段爬犁穿过阿拉斯加,
然后再……

我只是觉得这个方法容易误导一些VB程序员,以为使用了API就是上了个
层次……


#23


我同意熊王的,因为我就常用DIR(),api我也是为了程序精练才用,要是本例也用API,那也太长了吧?而且又不像enmity(灵感之源)兄说的可以“更肯定的”。因为我也看不出来这两种方式的效果上谁比谁更好。

#24


靠,小弟错了还不行呀,小弟以后不敢就是了,
我不过是说,csdn中的东西,是精髓还是糟粕,你自己批判的吸收,
大家这样讲话,会伤害人家的heart的

#25


enmity(灵感之源) 

谢谢你的代码

#26



  分  分分分分分
  分      分    分分
分分分分分   分    分分分分
 分  分  分     分分分分
 分  分  分     分分分分
 分  分分分分分分分   分分
分  分   分      分分
分分 分   分
  分分   分      分分
 分  分  分      分分
分     分分

#1


边抢分,边学习!!!
好好学习,天天向上!!!

#2


收藏

#3


hehe

#4


????

#5


楼上有什么问题吗?

#6


学习

#7



这样处理是是在滥用VB!!!!!!!!!!!!!!

VB的dir函数很好用

dir(pathname,16),就可以判断目录是否存在 (返回空值就不存在)
dir(pathname,0),就可以判断文件是否存在 (返回空值就不存在)
根本不需要那么多行,还居然用到了API?!
另外,使用错误处理来文件是否存在这样简单的问题是程序设计中
的非常非常坏的习惯。

#8


楼上的朋友说的没错,Dir函数既简单又有效,和不用之

#9


dir就行了,

#10


to: tuppin(熊王)
  
如果按照你的方法,

◇首先:
标准的vbDirectory放着不用,要硬编码使用16?
标准的vbNormal放着不用,要硬编码使用0?
如果vb改变了常量值,你的代码不是要改么?

◇其次,
你判断的是给定目录的属性“是”vbDirectory(目录)
我这里判断是给定目录的属性“有”vbDirectory(目录)
当目录含有不只一个属性,如隐藏、系统等其它属性的时候,你的判断是不全面的。

详细请参考:
关于判断文件/文件夹是否存在:
http://www.csdn.net/expert/topic/375/375537.xml


不经过认真测试和学习,而来否定别人的方法,才是非常坏的习惯吖!

我纯粹是在讨论技术,别在意。

#11


等一下来结帖子

#12


也可以用写文件再删除文件,然后捕捉错误的方法 不过不好

#13


不错

#14


真好:)

#15


而且,使用API是为了“更加肯定地”返回正确结果。

我并不是不想用现成的内置函数,只不过,有些时候,内置函数不大能胜任,我就选择使用API了。这是个人做法问题,您可以按照自己的实际情况使用您喜欢的方法。

谢谢参与讨论。

#16


而且,使用API是为了“更加肯定地”返回正确结果。

我并不是不想用现成的内置函数,只不过,有些时候,内置函数不大能胜任,我就选择使用API了。这是个人做法问题,您可以按照自己的实际情况使用您喜欢的方法。

谢谢参与讨论。

#17


Public Declare Function PathFileExists Lib "shlwapi.dll" Alias "PathFileExistsA" (ByVal lpszPath As String) As Long


Public Declare Function PathIsDirectory Lib "shlwapi.dll" Alias "PathIsDirectoryA" (ByVal lpszPath As String) As Long



If PathFileExists(<文件名>) <> 0 And PathIsDirectory(<文件名>) = 0 Then 文件存在。



PathFileExists 判断文件、目录是否存在,PathIsDirectory 判断目录是否存在。返回非零值表示存在。上面的判断语句判断<文件名>是否存在,并且确认它不是目录。



系统兼容性:


Windows NT/2000: Requires Windows 2000 (or Windows NT 4.0 with Internet Explorer 4.0 or later). 


Windows 95/98/Me: Requires Windows 98 (or Windows 95 with Internet Explorer 4.0 or later). 

#18


致enmity (灵感之源) 

我用0和16只是想描述简单一些,主要目的不是讨论编程风格,而是讨论实现技术。

dir的第二个参数包含了隐藏,只读,系统等等属性,
0也好,16也好,它们都是2的指数,
这种属性值可以“或”在一起用。

在请你告诉我,就判断一个Pathname到底是文件还是目录,是存在还是不存在这个问题,Dir如何作不到?dir又如何不能给出一个更加肯定的结果呢?
同样使用DIR,就以你给出的三个函数的入口和返回值为标准,写出的代码一定
比你的短和可靠,同时更易读,你相信吗?

我并不反对使用API,在我的程序中只有万不得以才使用,否则直接用C/C++好了,
干嘛用VB.

#19


致enmity (灵感之源) 

我用0和16只是想描述简单一些,主要目的不是讨论编程风格,而是讨论实现技术。

dir的第二个参数包含了隐藏,只读,系统等等属性,
0也好,16也好,它们都是2的指数,
这种属性值都是各占1bit,可以“或”在一起用。

在请你告诉我,就判断一个Pathname到底是文件还是目录,
是存在还是不存在这个问题,Dir()如何作不到?
dir()又如何不能给出一个更加肯定的结果呢?

同样使用DIR(),就以你给出的三个函数的入口和返回值为标准,
(如果你要求更多的功能,就没法讨论了)
写出的代码一定比你的短和可靠,同时更易读,你相信吗?


我并不反对使用API,在我的程序中只有万不得以才使用,否则直接用C/C++好了。



#20


不错。。。。。CSDN就是要有这样的好人

各位高手,得了吧,人家不是出题让你们来挑毛病的,任何一个方法都不可能尽善,想得太多的话,就什么也别做了,点到为止!!!

这里讨论的是实现问题,不是怎么实现更好的问题,

打个比方说:明明知道坐飞机可以到美国,我偏偏要用筋斗云,俺老孙

玩的就是这个。。。。。。。。。。。。。。。。。。。。

你们这样会打消人家的积极性的!!!

唉!!!

总有人。。。。。。。。

#21


喜欢抬杠。。。。。。。。。。。。。

#22


好好学习,天天向上
你的比方不恰当,应该是明明坐飞机可以到美国,偏要说先
坐火车到俄罗斯,然后作破冰船过白令海峡,还得作一段爬犁穿过阿拉斯加,
然后再……

我只是觉得这个方法容易误导一些VB程序员,以为使用了API就是上了个
层次……


#23


我同意熊王的,因为我就常用DIR(),api我也是为了程序精练才用,要是本例也用API,那也太长了吧?而且又不像enmity(灵感之源)兄说的可以“更肯定的”。因为我也看不出来这两种方式的效果上谁比谁更好。

#24


靠,小弟错了还不行呀,小弟以后不敢就是了,
我不过是说,csdn中的东西,是精髓还是糟粕,你自己批判的吸收,
大家这样讲话,会伤害人家的heart的

#25


enmity(灵感之源) 

谢谢你的代码

#26



  分  分分分分分
  分      分    分分
分分分分分   分    分分分分
 分  分  分     分分分分
 分  分  分     分分分分
 分  分分分分分分分   分分
分  分   分      分分
分分 分   分
  分分   分      分分
 分  分  分      分分
分     分分