用VB6(SP6)写了一个程序遍历磁盘的所有文件,里面用了On Error Resume Next语句忽略那些没有访问权限的文件。
结果到了Win2003上程序遍历到一些文件名包含日文字符的文件时就会突然崩溃,同样的文件在Win2000、WinXP上都可以正常运行(被On Error忽略)。
后来又发现,编译成P-code的话在win2003上也能正常运行了,但是性能要差50%左右。哪位高手能指点一下吗?

解决方案 »

  1.   

    拿到03里编译,去掉on error,试试能不能有具体的报错信息
      

  2.   

    遍历磁盘的所有文件,使用的是API还是DIR?如果是用API,那建议用DIR吧,可能可以把范围缩小点
      

  3.   


    在Win2003里编译也一样,报错信息如下:Run-time error '5':
    Invalid Procedure call or argument出错的语句就是一个File对象,因为文件名中有不能识别的日文字符,所以它的Name属性就变成了“??????.doc”。
    添加On Error后,在2000和XP里就可以忽略该错误,但是到了Win2003里访问到这个文件时又不行了,程序直接崩溃。
      

  4.   

    回3、4楼:我用的是FileSystemObject对象。
      

  5.   

    日文字符得按UNICODE处理是吧?不知道有人整过没?
      

  6.   


    Public Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long
    Public Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA" (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long
    Public Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) As Long'最大路径长度和文件属性常量的定义
    Public Const MAX_PATH = 260
    Public Const FILE_ATTRIBUTE_ARCHIVE = &H20
    Public Const FILE_ATTRIBUTE_COMPRESSED = &H800
    Public Const FILE_ATTRIBUTE_DIRECTORY = &H10
    Public Const FILE_ATTRIBUTE_HIDDEN = &H2
    Public Const FILE_ATTRIBUTE_NORMAL = &H80
    Public Const FILE_ATTRIBUTE_READONLY = &H1
    Public Const FILE_ATTRIBUTE_SYSTEM = &H4
    Public Const FILE_ATTRIBUTE_TEMPORARY = &H100'自定义数据类型FILETIME和WIN32_FIND_DATA的定义
    Public Type FILETIME
        dwLowDateTime As Long
        dwHighDateTime As Long
    End TypePublic 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 TypePublic Function fDelInvaildChr(str As String) As String    On Error Resume Next
        For i = Len(str) To 1 Step -1
            If Asc(Mid(str, i, 1)) <> 0 And Asc(Mid(str, i, 1)) <> 32 Then
                fDelInvaildChr = Left(str, i)
                Exit For
            End If
        Next
    End FunctionPublic Sub sDirTraversal(ByVal strPathName As String, ByRef objList As ListBox)  Dim sSubDir(200) As String '注释:存放当前目录下的子目录,下标可根据需要调整  Dim iIndex As Integer '注释:子目录数组下标  Dim i As Integer '注释:用于循环子目录的查找  Dim lHandle As Long '注释:FindFirstFileA 的句柄  Dim tFindData As WIN32_FIND_DATA '注释:  Dim strFileName As String ' 注释:文件名  On Error Resume Next'注释:   初始化变量  i = 1  iIndex = 0  tFindData.cFileName = "" '注释:初始化定长字符串  lHandle = FindFirstFile(strPathName & "\*.*", tFindData)  If lHandle = 0 Then '注释: 查询结束或发生错误Exit SubEnd IfstrFileName = fDelInvaildChr(tFindData.cFileName)If tFindData.dwFileAttributes = &H10 Then '注释: 目录  If strFileName <> "." And strFileName <> ".." Then    iIndex = iIndex + 1    sSubDir(iIndex) = strPathName & "\" & strFileName '注释:添加到目录数组  End IfElse  objList.AddItem strPathName & "\" & strFileNameEnd If'注释:循环查找下一个文件,直到结束Do While True  tFindData.cFileName = ""  If FindNextFile(lHandle, tFindData) = 0 Then '注释: 查询结束或发生错误    FindClose (lHandle)    Exit Do  Else    strFileName = fDelInvaildChr(tFindData.cFileName)    If tFindData.dwFileAttributes = &H10 Then      If strFileName <> "." And strFileName <> ".." Then        iIndex = iIndex + 1        sSubDir(iIndex) = strPathName & "\" & strFileName '注释:添加到目录数组      End If    Else      objList.AddItem strPathName & "\" & strFileName    End If  End IfLoop  '注释:如果该目录下有目录,则根据目录数组递归遍历  If iIndex > 0 Then    For i = 1 To iIndex      sDirTraversal sSubDir(i), objList    Next  End IfEnd Sub
      

  7.   

    我感觉不是操作系统的问题.
    你可以试一下这个日语文件名的DOC文件能否在2003下被打开,如果能,那就不是操作系统的问题.
    建议你使用API函数FindFirstFile,这样适应性强一些!
      

  8.   

    fso的话,用vbs脚本先试试不用编译的这样的话,很容易调整