VB6不能打开文件名中包含Unicode字符的文件,该怎么办?

时间:2022-12-29 20:19:35
例如,先在C盘下创建下一个名字中包括Unicode字符的文件: 
先创建C:\1.txt,然后在文件名中加入Unicode字符: 

Dim FSO As Object, fName As Object 
Set FSO = CreateObject("scripting.filesystemobject") 
Set fName = FSO.getfile("C:\1.txt") 
fName.Name = "123456" & ChrB(&H21) + ChrB(&H22) & ".txt" 

然后用下面的代码: 
        CommonDialog1.MaxFileSize = 128 
        CommonDialog1.FileName = "" 
        CommonDialog1.Flags = cdlOFNExplorer + cdlOFNFileMustExist + cdlOFNLongNames 
        CommonDialog1.Filter = "文件(*.txt)|*.txt" 
        CommonDialog1.ShowOpen 
        RichTextBox1.LoadFile CommonDialog1.FileName 

用文件打开窗体选中这个文件: 

结果报错: 
不能访问指定的路径/文件名 

如何才能让RichTextBox1可以读入这个名字中包括Unicode字符的文件中的内容?

42 个解决方案

#1


是不是权限的问题?

#2


不是,就是文件名中有Unicode字符,CommonDialog1.FileName中变成了一个问号

#3


用:shell("explorer 文件名") 试试

#4


问题出在 chrb 上了,改成 chr 另外不要加空格,windows好像不允许在文件名前后加空格,用系统方法给文件改名加空格时都会被忽略掉

问题的根源在于字符串的内码转换,ascii码和unicode转乱套了

vb的字符串是*使用的,一般情况下不要人工的进行干预转换,如果需要转换则应该是,使用者十分清楚vb在什么情况下转换,何时转换,转换之后的数据到底是什么

#5


在Windows下用记事本等,是可以打开这个TXT文件的

#6


把这个文件在Windows下改名为C:\x.txt,也确实就可以在VB中正常访问了。所以可以肯定就是文件名中有某些Unicode字符的问题

#7


问题是vb把文件名按照 unicode 的方式以 open 打开,这样文件名就错了,因为文件名本身的数据就是ansi,unicode混排,vb操作文件名字符串时候,又转了至少1次,所以会导致出问题

你那里文件名显示成什么样? 123!(空格).txt 吗?

#8


引用 4 楼 pctgl 的回复:
问题出在 chrb 上了,改成 chr 另外不要加空格,windows好像不允许在文件名前后加空格,用系统方法给文件改名加空格时都会被忽略掉

问题的根源在于字符串的内码转换,ascii码和unicode转乱套了

vb的字符串是*使用的,一般情况下不要人工的进行干预转换,如果需要转换则应该是,使用者十分清楚vb在什么情况下转换,何时转换,转换之后的数据到底是什么

ChrB的问题只是我潜的例子,为的是说明这个问题。

现在头疼的问题是,用户那里有一堆文件,名字中有些有Unicode字符,而我的程序打不开这些文件,这个该怎么办?

#9


你把chrb 换成 chr 再试,如果不行,申请一块内存,用系统api的文件选择框获取 ansi 文本的文件名,之后直接用 CreateFileA 打开操作文件,这样应该肯定没问题,前提是,其他一般程序也能打开。。。

#10


引用 7 楼 pctgl 的回复:
问题是vb把文件名按照 unicode 的方式以 open 打开,这样文件名就错了,因为文件名本身的数据就是ansi,unicode混排,vb操作文件名字符串时候,又转了至少1次,所以会导致出问题

你那里文件名显示成什么样? 123!(空格).txt 吗?

对,在DOS模式下看,就是文件名中多了一个空格,而在VB中取得文件名,变成一个问号!

#11


我想是不是RichTextBox1.LoadFile的问题(VB本身应该没有问题)。
试试:先用VB读文件,再传到RichTextBox1中!

#12


或者给文件名加上“”试试!

#13


引用 11 楼 cnfarer 的回复:
我想是不是RichTextBox1.LoadFile的问题(VB本身应该没有问题)。
试试:先用VB读文件,再传到RichTextBox1中!

用下面的语句,选中这个文件:
Dim fil As Scripting.File
Dim tex As Scripting.TextStream
Set fil = fso.GetFile(CommonDialog1.FileName) 
一样提示文件找不到,但是这个文件肯定用“记事本”程序是可以打开的

#14



我找到了一种方法,lz 稍等我写下代码,传上来,这是个问题。。。 vb的事中字符串转换过程实在讨厌

#15



Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameW" (pOpenfilename As OPENFILENAME) As Long
  Private Type OPENFILENAME
     lStructSize As Long
     hwndOwner As Long
     hInstance As Long
     lpstrFilter As Long
     lpstrCustomFilter As String
     nMaxCustFilter As Long
     nFilterIndex As Long
     lpstrFile As Long
     nMaxFile As Long
     lpstrFileTitle As String
     nMaxFileTitle As Long
     lpstrInitialDir As Long
     lpstrTitle As String
     flags As Long
     nFileOffset As Integer
     nFileExtension As Integer
     lpstrDefExt As String
     lCustData As Long
     lpfnHook As Long
     lpTemplateName As String
End Type


Public Function UserGetFile(ByVal FileTypeClass As String, _
                            Optional ByVal sFileTypeText As String = vbNullString, _
                            Optional ByVal InitializeDir As String = vbNullString) As String

     Dim OpenFile As OPENFILENAME
     Dim sFileName(512) As Byte
     Dim FileTypeText As String

     If sFileTypeText = vbNullString Then FileTypeText = FileTypeClass & " 类型文件"
     
     With OpenFile
        .lStructSize = Len(OpenFile)
        .hwndOwner = Me.hWnd
        .hInstance = App.hInstance
        FileTypeText = FileTypeText & Chr(0) & FileTypeClass & Chr(0) & Chr(0)  '''格式:描述....&.....文件类型
        .lpstrFilter = StrPtr(FileTypeText)
        .nFilterIndex = 1
        .lpstrFile = VarPtr(sFileName(0))
        .nMaxFile = 512
        .lpstrInitialDir = StrPtr(InitializeDir)
     End With

     If GetOpenFileName(OpenFile) Then
        UserGetFile = StrConv(sFileName, vbUnicode)
     Else
        UserGetFile = vbNullChar
     End If
     
End Function

Private Sub Command2_Click()
    Dim i As String
    i = UserGetFile("*.txt")
    Open i For Binary As #1
        '这样,打开时不应该报错。。。。
        
    Close
    
End Sub

#16


晕,错了

#17


楼主,
你要打开的文件名在Windows下显示的是什么?能不能写一个上来,我们看看

#18


引用 17 楼 veron_04 的回复:
楼主,
你要打开的文件名在Windows下显示的是什么?能不能写一个上来,我们看看

请看,在Windows中同一个目录下,竟然有两个完全相同的“清单.txt”,其中一个在Dos模式下似乎是多了个空格,而在VB的CommonDialog.FileName中,则变成了“?清单.txt”,然后又不能访问。
请看下图: VB6不能打开文件名中包含Unicode字符的文件,该怎么办?

#19


包括有Unicode字符的文件我也放在了这里,大家如果愿意,可以下载试试,感谢帮助:
http://www.ynzsjm.com/1.rar

#20


你使用 短路径 改变文件名称即可

摘录 CBM666 编程教材 文本文件篇 示例代码 修改了一下 你自己再改吧

Option Explicit
Private Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long
Dim Fname$, aa$
Private Sub Form_Load()
   Fname = GetShortName("c:\123456" & ChrB(&H21) & ChrB(&H22)) & ".txt"
   Command1.Caption = "写入文件"
   Command2.Caption = "读取文件"
End Sub

Private Sub Command1_Click()
   Open Fname For Output As #1
   Print #1, "cbm666"
   Close #1
   MsgBox "写入完成!"
End Sub

Private Sub Command2_Click()
   If Dir(Fname) <> "" Then
      Open Fname For Input As #1
      Line Input #1, aa
      Close #1
      MsgBox aa
   End If
End Sub

Public Function GetShortName(ByVal sLongFileName As String) As String
   On Error Resume Next
   Dim lRetVal&, sShortPathName$
   sShortPathName = Space(255)
   Call GetShortPathName(sLongFileName, sShortPathName, 255)
   If InStr(sShortPathName, Chr(0)) > 0 Then
      GetShortName = Mid(sShortPathName, 1, InStr(sShortPathName, Chr(0)) - 1)
   Else
      GetShortName = Trim(Mid(sShortPathName, 1))
   End If
End Function


VB6不能打开文件名中包含Unicode字符的文件,该怎么办?

#21


楼上的朋友,谢谢您深夜回贴,可是不行啊

#22


用open打开可能确实不太好弄,不过可以肯定的是,CreateFileW绝对没问题。。。。
因为记事本就是那样操作的,建议 lz 还是用api操作文件吧,不行就先用 CreateFileW把文件名全部改正常之后再用open操作。。。。 也是个办法的。。。

#23


#24


可能只有纯 API 操作了 ............

#25


好象是有专门的查件解决这个问题。。。

#26


lz 能不能说说你要对文件进行什么操作? 

如果只是简单的移动,复制之类的,我可以用api简单的给你封装一个函数,供你用,不过分要全给我 :)

说实话,vb的 open put,get 这些文件操作函数,我都没怎么用过

那些api也不是很麻烦,用起来和open差不太多,只是有些地方稍微麻烦点而已

#27


引用 26 楼 pctgl 的回复:
lz 能不能说说你要对文件进行什么操作?

如果只是简单的移动,复制之类的,我可以用api简单的给你封装一个函数,供你用,不过分要全给我 :)

说实话,vb的 open put,get 这些文件操作函数,我都没怎么用过

那些api也不是很麻烦,用起来和open差不太多,只是有些地方稍微麻烦点而已

我要将这个文件改一个名字,但是文件是用户以拖动形式或打开文件对话框选中的

#28


分的话,可以这样,我再开二个VB贴。给您200分,这个贴子别的朋友也参与了讨论,我认为还是应当给大家一些分(虽然实际上有的朋友可能也不在意这点“分”),这样才对得起大家的指点。

#29


引用 27 楼 ynduanlian 的回复:
引用 26 楼 pctgl 的回复:
lz 能不能说说你要对文件进行什么操作?

如果只是简单的移动,复制之类的,我可以用api简单的给你封装一个函数,供你用,不过分要全给我 :)

说实话,vb的 open put,get 这些文件操作函数,我都没怎么用过

那些api也不是很麻烦,用起来和open差不太多,只是有些地方稍微麻烦点而已

我要将这个文件改一个名字,但是文件是用户以拖动形式或打开文件对话框选中的


修改名字,有规则吗?直接更改名字有可能可以

#30


http://topic.csdn.net/u/20091214/17/c2fb58db-2966-4e13-bce6-662c39d8bc26.html?81866
16楼我已经回复,shrFile = fsoFile.ShortPath得出的文件路径要以直接用或用于改名。

#31


http://topic.csdn.net/u/20091214/17/c2fb58db-2966-4e13-bce6-662c39d8bc26.html?81866
16楼我已经回复,shrFile = fsoFile.ShortPath得出的文件路径可以直接使用或用于文件改名。 

#32



简单的做了一个,添加一个 按钮, 添加以下代码

Option Explicit

Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameW" (pOpenfilename As OPENFILENAME) As Long
  Private Type OPENFILENAME
    lStructSize As Long
    hwndOwner As Long
    hInstance As Long
    lpstrFilter As Long
    lpstrCustomFilter As String
    nMaxCustFilter As Long
    nFilterIndex As Long
    lpstrFile As Long
    nMaxFile As Long
    lpstrFileTitle As String
    nMaxFileTitle As Long
    lpstrInitialDir As Long
    lpstrTitle As String
    flags As Long
    nFileOffset As Integer
    nFileExtension As Integer
    lpstrDefExt As String
    lCustData As Long
    lpfnHook As Long
    lpTemplateName As String
End Type
Private Declare Function MoveFile Lib "kernel32" Alias "MoveFileW" (lpExistingFileName As Any, ByVal lpNewFileName As Long) As Long


Function UserGetFile(UserSelected() As Byte, ByVal FileTypeClass As String, _
                            Optional ByVal sFileTypeText As String = vbNullString, _
                            Optional ByVal InitializeDir As String = vbNullString) As Boolean

'******
'   api 的文件选择框
'
'  用户是否选择了文件 = UserGetFile(选择的文件, 过滤的文件类型[比如 *.txt ], 该类型的描述文本 [比如 文本文件], 初始化目录 )
'
'       返回空值说明用户没有正常选择文件,可能点了取消或者关闭了窗口
'
    Dim OpenFile As OPENFILENAME
    Dim sFileName(512) As Byte
    Dim FileTypeText As String

    If sFileTypeText = vbNullString Then sFileTypeText = FileTypeClass & " 类型文件"
   
    With OpenFile
        .lStructSize = Len(OpenFile)
        .hwndOwner = Me.hWnd
        .hInstance = App.hInstance
        FileTypeText = sFileTypeText & vbNullChar & FileTypeClass & vbNullChar & vbNullChar     '''格式:描述....&.....文件类型
        .lpstrFilter = StrPtr(FileTypeText)
        .nFilterIndex = 1
        .lpstrFile = VarPtr(sFileName(0))
        .nMaxFile = 512
        .lpstrInitialDir = StrPtr(InitializeDir)
    End With

    If GetOpenFileName(OpenFile) Then
        UserGetFile = True
        UserSelected = sFileName
    End If
   
End Function

Function ReName(newFileName As String) As Boolean
    Dim mulBits() As Byte
    '首先在函数外面声明一个字节数组,用来存放用户选择的文件路径数据
    '然后调用 UserGetFile,如果返回 True 说明,用户正确的选择了一个文件,文件路径存放在 mulBits 数组中了
    
    If UserGetFile(mulBits, "*.txt", "文本文件", "d:\") Then _
        ReName = MoveFile(mulBits(0), StrPtr(newFileName))
        '调用 MoveFile 函数对用户所选择的文件进行改名
        '具体使用方法,参考代码中的例子, MoveFile 使用的是 W(Unicode)系列函数, 参数1声明为了 any,参数2为long
        '使用方法见上面的 movefile 例子
        
End Function

Private Sub Command1_Click()
    
    Debug.Print ReName("asdf.txt"), "返回 True 代表执行成功"
    
End Sub

#33


引用 31 楼 chinaboyzyq 的回复:
http://topic.csdn.net/u/20091214/17/c2fb58db-2966-4e13-bce6-662c39d8bc26.html?81866
16楼我已经回复,shrFile = fsoFile.ShortPath得出的文件路径可以直接使用或用于文件改名。

感谢您的指点,但是您的改名代码对我而言有点问题,我不可能要求用户运行程序时必须把所有要处理的文件放在某个目录下(然后用您的程序处理),我只能改用户在打开文件对话框点中的的那个文件的名字。

#34


楼主的  fName.Name = "123456" & ChrB(&H21) + ChrB(&H22) & ".txt" 可能有问题,chrB()函数总是返回一个 单字节,可能是显示∡的原因。用 chrW()试试,它返回的是unicode字符。  

#35


这两天忙于别的问题,等周末研究下

#36


........ 还要研究什么,把我给你的代码复制到vb,运行一下不是立刻就知道行不行了吗

#37


引用 36 楼 pctgl 的回复:
........ 还要研究什么,把我给你的代码复制到vb,运行一下不是立刻就知道行不行了吗

放心,能运行另开贴单给您200分。你们大家给这个问题这么多帮助,一点分又怎么足以表达我的谢意呢

#38


VB6不能打开文件名中包含Unicode字符的文件,该怎么办?

#39


引用 33 楼 ynduanlian 的回复:
感谢您的指点,但是您的改名代码对我而言有点问题,我不可能要求用户运行程序时必须把所有要处理的文件放在某个目录下(然后用您的程序处理),我只能改用户在打开文件对话框点中的的那个文件的名字。

LS:估计你白忙忽了!

VB6不能打开文件名中包含Unicode字符的文件,该怎么办?

#41


路过....

#42


转了一圈又一圈,这里面的问题都太高深太专业了,俺只有提问的份,没分时俺咋整呢

#1


是不是权限的问题?

#2


不是,就是文件名中有Unicode字符,CommonDialog1.FileName中变成了一个问号

#3


用:shell("explorer 文件名") 试试

#4


问题出在 chrb 上了,改成 chr 另外不要加空格,windows好像不允许在文件名前后加空格,用系统方法给文件改名加空格时都会被忽略掉

问题的根源在于字符串的内码转换,ascii码和unicode转乱套了

vb的字符串是*使用的,一般情况下不要人工的进行干预转换,如果需要转换则应该是,使用者十分清楚vb在什么情况下转换,何时转换,转换之后的数据到底是什么

#5


在Windows下用记事本等,是可以打开这个TXT文件的

#6


把这个文件在Windows下改名为C:\x.txt,也确实就可以在VB中正常访问了。所以可以肯定就是文件名中有某些Unicode字符的问题

#7


问题是vb把文件名按照 unicode 的方式以 open 打开,这样文件名就错了,因为文件名本身的数据就是ansi,unicode混排,vb操作文件名字符串时候,又转了至少1次,所以会导致出问题

你那里文件名显示成什么样? 123!(空格).txt 吗?

#8


引用 4 楼 pctgl 的回复:
问题出在 chrb 上了,改成 chr 另外不要加空格,windows好像不允许在文件名前后加空格,用系统方法给文件改名加空格时都会被忽略掉

问题的根源在于字符串的内码转换,ascii码和unicode转乱套了

vb的字符串是*使用的,一般情况下不要人工的进行干预转换,如果需要转换则应该是,使用者十分清楚vb在什么情况下转换,何时转换,转换之后的数据到底是什么

ChrB的问题只是我潜的例子,为的是说明这个问题。

现在头疼的问题是,用户那里有一堆文件,名字中有些有Unicode字符,而我的程序打不开这些文件,这个该怎么办?

#9


你把chrb 换成 chr 再试,如果不行,申请一块内存,用系统api的文件选择框获取 ansi 文本的文件名,之后直接用 CreateFileA 打开操作文件,这样应该肯定没问题,前提是,其他一般程序也能打开。。。

#10


引用 7 楼 pctgl 的回复:
问题是vb把文件名按照 unicode 的方式以 open 打开,这样文件名就错了,因为文件名本身的数据就是ansi,unicode混排,vb操作文件名字符串时候,又转了至少1次,所以会导致出问题

你那里文件名显示成什么样? 123!(空格).txt 吗?

对,在DOS模式下看,就是文件名中多了一个空格,而在VB中取得文件名,变成一个问号!

#11


我想是不是RichTextBox1.LoadFile的问题(VB本身应该没有问题)。
试试:先用VB读文件,再传到RichTextBox1中!

#12


或者给文件名加上“”试试!

#13


引用 11 楼 cnfarer 的回复:
我想是不是RichTextBox1.LoadFile的问题(VB本身应该没有问题)。
试试:先用VB读文件,再传到RichTextBox1中!

用下面的语句,选中这个文件:
Dim fil As Scripting.File
Dim tex As Scripting.TextStream
Set fil = fso.GetFile(CommonDialog1.FileName) 
一样提示文件找不到,但是这个文件肯定用“记事本”程序是可以打开的

#14



我找到了一种方法,lz 稍等我写下代码,传上来,这是个问题。。。 vb的事中字符串转换过程实在讨厌

#15



Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameW" (pOpenfilename As OPENFILENAME) As Long
  Private Type OPENFILENAME
     lStructSize As Long
     hwndOwner As Long
     hInstance As Long
     lpstrFilter As Long
     lpstrCustomFilter As String
     nMaxCustFilter As Long
     nFilterIndex As Long
     lpstrFile As Long
     nMaxFile As Long
     lpstrFileTitle As String
     nMaxFileTitle As Long
     lpstrInitialDir As Long
     lpstrTitle As String
     flags As Long
     nFileOffset As Integer
     nFileExtension As Integer
     lpstrDefExt As String
     lCustData As Long
     lpfnHook As Long
     lpTemplateName As String
End Type


Public Function UserGetFile(ByVal FileTypeClass As String, _
                            Optional ByVal sFileTypeText As String = vbNullString, _
                            Optional ByVal InitializeDir As String = vbNullString) As String

     Dim OpenFile As OPENFILENAME
     Dim sFileName(512) As Byte
     Dim FileTypeText As String

     If sFileTypeText = vbNullString Then FileTypeText = FileTypeClass & " 类型文件"
     
     With OpenFile
        .lStructSize = Len(OpenFile)
        .hwndOwner = Me.hWnd
        .hInstance = App.hInstance
        FileTypeText = FileTypeText & Chr(0) & FileTypeClass & Chr(0) & Chr(0)  '''格式:描述....&.....文件类型
        .lpstrFilter = StrPtr(FileTypeText)
        .nFilterIndex = 1
        .lpstrFile = VarPtr(sFileName(0))
        .nMaxFile = 512
        .lpstrInitialDir = StrPtr(InitializeDir)
     End With

     If GetOpenFileName(OpenFile) Then
        UserGetFile = StrConv(sFileName, vbUnicode)
     Else
        UserGetFile = vbNullChar
     End If
     
End Function

Private Sub Command2_Click()
    Dim i As String
    i = UserGetFile("*.txt")
    Open i For Binary As #1
        '这样,打开时不应该报错。。。。
        
    Close
    
End Sub

#16


晕,错了

#17


楼主,
你要打开的文件名在Windows下显示的是什么?能不能写一个上来,我们看看

#18


引用 17 楼 veron_04 的回复:
楼主,
你要打开的文件名在Windows下显示的是什么?能不能写一个上来,我们看看

请看,在Windows中同一个目录下,竟然有两个完全相同的“清单.txt”,其中一个在Dos模式下似乎是多了个空格,而在VB的CommonDialog.FileName中,则变成了“?清单.txt”,然后又不能访问。
请看下图: VB6不能打开文件名中包含Unicode字符的文件,该怎么办?

#19


包括有Unicode字符的文件我也放在了这里,大家如果愿意,可以下载试试,感谢帮助:
http://www.ynzsjm.com/1.rar

#20


你使用 短路径 改变文件名称即可

摘录 CBM666 编程教材 文本文件篇 示例代码 修改了一下 你自己再改吧

Option Explicit
Private Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long
Dim Fname$, aa$
Private Sub Form_Load()
   Fname = GetShortName("c:\123456" & ChrB(&H21) & ChrB(&H22)) & ".txt"
   Command1.Caption = "写入文件"
   Command2.Caption = "读取文件"
End Sub

Private Sub Command1_Click()
   Open Fname For Output As #1
   Print #1, "cbm666"
   Close #1
   MsgBox "写入完成!"
End Sub

Private Sub Command2_Click()
   If Dir(Fname) <> "" Then
      Open Fname For Input As #1
      Line Input #1, aa
      Close #1
      MsgBox aa
   End If
End Sub

Public Function GetShortName(ByVal sLongFileName As String) As String
   On Error Resume Next
   Dim lRetVal&, sShortPathName$
   sShortPathName = Space(255)
   Call GetShortPathName(sLongFileName, sShortPathName, 255)
   If InStr(sShortPathName, Chr(0)) > 0 Then
      GetShortName = Mid(sShortPathName, 1, InStr(sShortPathName, Chr(0)) - 1)
   Else
      GetShortName = Trim(Mid(sShortPathName, 1))
   End If
End Function


VB6不能打开文件名中包含Unicode字符的文件,该怎么办?

#21


楼上的朋友,谢谢您深夜回贴,可是不行啊

#22


用open打开可能确实不太好弄,不过可以肯定的是,CreateFileW绝对没问题。。。。
因为记事本就是那样操作的,建议 lz 还是用api操作文件吧,不行就先用 CreateFileW把文件名全部改正常之后再用open操作。。。。 也是个办法的。。。

#23


#24


可能只有纯 API 操作了 ............

#25


好象是有专门的查件解决这个问题。。。

#26


lz 能不能说说你要对文件进行什么操作? 

如果只是简单的移动,复制之类的,我可以用api简单的给你封装一个函数,供你用,不过分要全给我 :)

说实话,vb的 open put,get 这些文件操作函数,我都没怎么用过

那些api也不是很麻烦,用起来和open差不太多,只是有些地方稍微麻烦点而已

#27


引用 26 楼 pctgl 的回复:
lz 能不能说说你要对文件进行什么操作?

如果只是简单的移动,复制之类的,我可以用api简单的给你封装一个函数,供你用,不过分要全给我 :)

说实话,vb的 open put,get 这些文件操作函数,我都没怎么用过

那些api也不是很麻烦,用起来和open差不太多,只是有些地方稍微麻烦点而已

我要将这个文件改一个名字,但是文件是用户以拖动形式或打开文件对话框选中的

#28


分的话,可以这样,我再开二个VB贴。给您200分,这个贴子别的朋友也参与了讨论,我认为还是应当给大家一些分(虽然实际上有的朋友可能也不在意这点“分”),这样才对得起大家的指点。

#29


引用 27 楼 ynduanlian 的回复:
引用 26 楼 pctgl 的回复:
lz 能不能说说你要对文件进行什么操作?

如果只是简单的移动,复制之类的,我可以用api简单的给你封装一个函数,供你用,不过分要全给我 :)

说实话,vb的 open put,get 这些文件操作函数,我都没怎么用过

那些api也不是很麻烦,用起来和open差不太多,只是有些地方稍微麻烦点而已

我要将这个文件改一个名字,但是文件是用户以拖动形式或打开文件对话框选中的


修改名字,有规则吗?直接更改名字有可能可以

#30


http://topic.csdn.net/u/20091214/17/c2fb58db-2966-4e13-bce6-662c39d8bc26.html?81866
16楼我已经回复,shrFile = fsoFile.ShortPath得出的文件路径要以直接用或用于改名。

#31


http://topic.csdn.net/u/20091214/17/c2fb58db-2966-4e13-bce6-662c39d8bc26.html?81866
16楼我已经回复,shrFile = fsoFile.ShortPath得出的文件路径可以直接使用或用于文件改名。 

#32



简单的做了一个,添加一个 按钮, 添加以下代码

Option Explicit

Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameW" (pOpenfilename As OPENFILENAME) As Long
  Private Type OPENFILENAME
    lStructSize As Long
    hwndOwner As Long
    hInstance As Long
    lpstrFilter As Long
    lpstrCustomFilter As String
    nMaxCustFilter As Long
    nFilterIndex As Long
    lpstrFile As Long
    nMaxFile As Long
    lpstrFileTitle As String
    nMaxFileTitle As Long
    lpstrInitialDir As Long
    lpstrTitle As String
    flags As Long
    nFileOffset As Integer
    nFileExtension As Integer
    lpstrDefExt As String
    lCustData As Long
    lpfnHook As Long
    lpTemplateName As String
End Type
Private Declare Function MoveFile Lib "kernel32" Alias "MoveFileW" (lpExistingFileName As Any, ByVal lpNewFileName As Long) As Long


Function UserGetFile(UserSelected() As Byte, ByVal FileTypeClass As String, _
                            Optional ByVal sFileTypeText As String = vbNullString, _
                            Optional ByVal InitializeDir As String = vbNullString) As Boolean

'******
'   api 的文件选择框
'
'  用户是否选择了文件 = UserGetFile(选择的文件, 过滤的文件类型[比如 *.txt ], 该类型的描述文本 [比如 文本文件], 初始化目录 )
'
'       返回空值说明用户没有正常选择文件,可能点了取消或者关闭了窗口
'
    Dim OpenFile As OPENFILENAME
    Dim sFileName(512) As Byte
    Dim FileTypeText As String

    If sFileTypeText = vbNullString Then sFileTypeText = FileTypeClass & " 类型文件"
   
    With OpenFile
        .lStructSize = Len(OpenFile)
        .hwndOwner = Me.hWnd
        .hInstance = App.hInstance
        FileTypeText = sFileTypeText & vbNullChar & FileTypeClass & vbNullChar & vbNullChar     '''格式:描述....&.....文件类型
        .lpstrFilter = StrPtr(FileTypeText)
        .nFilterIndex = 1
        .lpstrFile = VarPtr(sFileName(0))
        .nMaxFile = 512
        .lpstrInitialDir = StrPtr(InitializeDir)
    End With

    If GetOpenFileName(OpenFile) Then
        UserGetFile = True
        UserSelected = sFileName
    End If
   
End Function

Function ReName(newFileName As String) As Boolean
    Dim mulBits() As Byte
    '首先在函数外面声明一个字节数组,用来存放用户选择的文件路径数据
    '然后调用 UserGetFile,如果返回 True 说明,用户正确的选择了一个文件,文件路径存放在 mulBits 数组中了
    
    If UserGetFile(mulBits, "*.txt", "文本文件", "d:\") Then _
        ReName = MoveFile(mulBits(0), StrPtr(newFileName))
        '调用 MoveFile 函数对用户所选择的文件进行改名
        '具体使用方法,参考代码中的例子, MoveFile 使用的是 W(Unicode)系列函数, 参数1声明为了 any,参数2为long
        '使用方法见上面的 movefile 例子
        
End Function

Private Sub Command1_Click()
    
    Debug.Print ReName("asdf.txt"), "返回 True 代表执行成功"
    
End Sub

#33


引用 31 楼 chinaboyzyq 的回复:
http://topic.csdn.net/u/20091214/17/c2fb58db-2966-4e13-bce6-662c39d8bc26.html?81866
16楼我已经回复,shrFile = fsoFile.ShortPath得出的文件路径可以直接使用或用于文件改名。

感谢您的指点,但是您的改名代码对我而言有点问题,我不可能要求用户运行程序时必须把所有要处理的文件放在某个目录下(然后用您的程序处理),我只能改用户在打开文件对话框点中的的那个文件的名字。

#34


楼主的  fName.Name = "123456" & ChrB(&H21) + ChrB(&H22) & ".txt" 可能有问题,chrB()函数总是返回一个 单字节,可能是显示∡的原因。用 chrW()试试,它返回的是unicode字符。  

#35


这两天忙于别的问题,等周末研究下

#36


........ 还要研究什么,把我给你的代码复制到vb,运行一下不是立刻就知道行不行了吗

#37


引用 36 楼 pctgl 的回复:
........ 还要研究什么,把我给你的代码复制到vb,运行一下不是立刻就知道行不行了吗

放心,能运行另开贴单给您200分。你们大家给这个问题这么多帮助,一点分又怎么足以表达我的谢意呢

#38


VB6不能打开文件名中包含Unicode字符的文件,该怎么办?

#39


引用 33 楼 ynduanlian 的回复:
感谢您的指点,但是您的改名代码对我而言有点问题,我不可能要求用户运行程序时必须把所有要处理的文件放在某个目录下(然后用您的程序处理),我只能改用户在打开文件对话框点中的的那个文件的名字。

LS:估计你白忙忽了!

VB6不能打开文件名中包含Unicode字符的文件,该怎么办?

#40


#41


路过....

#42


转了一圈又一圈,这里面的问题都太高深太专业了,俺只有提问的份,没分时俺咋整呢