SHFileExists函数的声明如下:
Private Declare Function SHFileExists Lib "shell32" Alias "#45" (ByVal szPath As String) As Long
如果文件夹或文件存在,返回1;否则返回0
因此可以这样判断文件夹或文件是否存在:
SHFileExists(StrConv(Text1.Text, vbUnicode)) <> 0 ,这里一定要先把路径转换成Unicode编码,否则总返回0。
如果我们在文本框内输入一文件夹或文件的路径,用MsgBox SHFileExists(StrConv(Text1.Text, vbUnicode)) <> 0,能正确判断。比如d:\丽.txt,如果文件存在则返回true,否则返回flase。
但发现SHFileExists对某些路径就是返回0。比如文件中存在“美”字等等。比如,我们把上面的文件d:\丽.txt改为d:\美丽.txt,然后在文本框中也输入正确的d:\美丽.txt,就是返回flase。也就是StrConv()函数在进行转换时出现问题了。
在找不到问题解决的情况下,我只能改用PathFileExists函数。PathFileExists的声明如下:
Private Declare Function PathFileExists Lib "shlwapi.dll" Alias "PathFileExistsA" (ByVal pszPath As String) As Long
如果文件夹存在返回非0,否则返回0
因此可以这样使用:CBool(PathFileExists(Text1.Text)
上面的测试改用MsgBox CBool(PathFileExists(Text1.Text))后一切正常。所以我想问题可能出在StrConv()函数上。
请问高手们,是不是strConv出问题了,上面SHFileExists如果非要使用,如何解决?

解决方案 »

  1.   

    直接用Dir函数
    本示例使用 Dir 函数来检查某些文件或目录是否存在。在 Macintosh 计算机上,默认驱动器名称是 “HD” ,并且路径部分由冒号取代反斜线隔开。而且 Microsoft Windows 的通配符在 Mac 中可以作为有效字符出现在文件名中。也可以使用 MacID 函数来指定文件组。Dim MyFile, MyPath, MyName' 返回“WIN.INI” (如果该文件存在)。
    MyFile = Dir("C:\WINDOWS\WIN.ini")   ' 返回带指定扩展名的文件名。如果超过一个 *.ini 文件存在,
    ' 函数将返回按条件第一个找到的文件名。
    MyFile = Dir("C:\WINDOWS\*.ini")' 若第二次调用 Dir 函数,但不带任何参数,则函数将返回同一目录下的下一个 *.ini 文件。
    MyFile = Dir' 返回找到的第一个隐式 *.TXT 文件。
    MyFile = Dir("*.TXT", vbHidden)' 显示 C:\ 目录下的名称。
    MyPath = "c:\"   ' 指定路径。
    MyName = Dir(MyPath, vbDirectory)   ' 找寻第一项。
    Do While MyName <> ""   ' 开始循环。
       ' 跳过当前的目录及上层目录。
       If MyName <> "." And MyName <> ".." Then
          ' 使用位比较来确定 MyName 代表一目录。
          If (GetAttr(MyPath & MyName) And vbDirectory) = vbDirectory Then
             Debug.Print MyName   ' 如果它是一个目录,将其名称显示出来。
          End If
       End If
       MyName = Dir   ' 查找下一个目录。
    Loop
      

  2.   

    Private Declare Function SHFileExists& Lib "shell32" Alias "#45" (ByVal FilePath As Long)Private Sub Form_Load()
    MsgBox SHFileExists(StrPtr("C:\美丽》“、〕【)] 〉《※↑●№§№→のねぅ.txt"))
    End Sub
      

  3.   

    shlwapi.dll 中的 PathFileExists 其实有两个版本 PathFileExistsA、PathFileExistsW,所以可以在 Declare 语句中通过 Alias "PathFileExistsA" 选择适合 VB 使用的版本。而 shell32.dll 中的 #45 函数只有一个版本,并且是与操作系统相关的,最严密的方式是参考下面的链接中的处理方式,当然如果限定在 WinXP 下使用,强制 StrConv() 或 2 楼的方式都是可以的。
    http://vbnet.mvps.org/index.html?code/shell/undocshpaths.htm
      

  4.   

    Private Declare Function SHFileExists& Lib "shell32" Alias "#45" (ByVal FilePath As Long) as longPrivate Sub Form_Load()
    MsgBox SHFileExists(StrPtr("C:\美丽.txt"))
    End Sub
    用这种方法可以了,那么现在的问题是StrConv函数出错了吗?
      

  5.   

    请看:
    http://topic.csdn.net/u/20090901/09/dddf35aa-7838-4415-85b2-222358422d81.html
      

  6.   

    Option Explicit
    Private Declare Function GetDesktopWindow Lib "user32.dll" () As Long
    Private Declare Function IsWindowUnicode Lib "user32.dll" (ByVal hWnd As Long) As Long
    Private Declare Function GetFileAttributesW Lib "kernel32.dll" (ByVal lpFileName As Long) As Long
    Private Declare Function GetFileAttributes Lib "kernel32.dll" Alias "GetFileAttributesA" (ByVal lpFileName As String) As Long
    Private Declare Function SetFileAttributesW Lib "kernel32.dll" (ByVal lpFileName As Long, ByVal dwFileAttributes As Long) As Long
    Private Declare Function SetFileAttributes Lib "kernel32.dll" Alias "SetFileAttributesA" (ByVal lpFileName As String, ByVal dwFileAttributes As Long) As Long
    Private Declare Function DeleteFileW Lib "kernel32.dll" (ByVal lpFileName As Long) As Long
    Private Declare Function DeleteFile Lib "kernel32.dll" Alias "DeleteFileA" (ByVal lpFileName As String) As Long
    Private Const INVALID_HANDLE_VALUE = -1&
    Private Const FILE_ATTRIBUTE_NORMAL = &H80&Private Function IsUnicodeSystem() As Boolean    IsUnicodeSystem = (Not (IsWindowUnicode(GetDesktopWindow) = 0&))End FunctionPrivate Function DoesFileExists(Filename As String, useUnicode As Boolean) As Boolean' test to see if a file exists    If useUnicode Then
            DoesFileExists = Not (GetFileAttributesW(StrPtr(Filename)) = INVALID_HANDLE_VALUE)
        Else
            DoesFileExists = Not (GetFileAttributes(Filename) = INVALID_HANDLE_VALUE)
        End IfEnd Function
    调用:
    Dim bFileExist as Boolean
    bFileExist = DoesFileExists( "C:\Windows\Notepad.exe",IsUnicodeSystem)