先创建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在什么情况下转换,何时转换,转换之后的数据到底是什么
问题的根源在于字符串的内码转换,ascii码和unicode转乱套了
vb的字符串是*使用的,一般情况下不要人工的进行干预转换,如果需要转换则应该是,使用者十分清楚vb在什么情况下转换,何时转换,转换之后的数据到底是什么
#5
在Windows下用记事本等,是可以打开这个TXT文件的
#6
把这个文件在Windows下改名为C:\x.txt,也确实就可以在VB中正常访问了。所以可以肯定就是文件名中有某些Unicode字符的问题
#7
问题是vb把文件名按照 unicode 的方式以 open 打开,这样文件名就错了,因为文件名本身的数据就是ansi,unicode混排,vb操作文件名字符串时候,又转了至少1次,所以会导致出问题
你那里文件名显示成什么样? 123!(空格).txt 吗?
你那里文件名显示成什么样? 123!(空格).txt 吗?
#8
ChrB的问题只是我潜的例子,为的是说明这个问题。
现在头疼的问题是,用户那里有一堆文件,名字中有些有Unicode字符,而我的程序打不开这些文件,这个该怎么办?
#9
你把chrb 换成 chr 再试,如果不行,申请一块内存,用系统api的文件选择框获取 ansi 文本的文件名,之后直接用 CreateFileA 打开操作文件,这样应该肯定没问题,前提是,其他一般程序也能打开。。。
#10
对,在DOS模式下看,就是文件名中多了一个空格,而在VB中取得文件名,变成一个问号!
#11
我想是不是RichTextBox1.LoadFile的问题(VB本身应该没有问题)。
试试:先用VB读文件,再传到RichTextBox1中!
试试:先用VB读文件,再传到RichTextBox1中!
#12
或者给文件名加上“”试试!
#13
用下面的语句,选中这个文件:
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下显示的是什么?能不能写一个上来,我们看看
你要打开的文件名在Windows下显示的是什么?能不能写一个上来,我们看看
#18
请看,在Windows中同一个目录下,竟然有两个完全相同的“清单.txt”,其中一个在Dos模式下似乎是多了个空格,而在VB的CommonDialog.FileName中,则变成了“?清单.txt”,然后又不能访问。
请看下图:
#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
摘录 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
#21
楼上的朋友,谢谢您深夜回贴,可是不行啊
#22
用open打开可能确实不太好弄,不过可以肯定的是,CreateFileW绝对没问题。。。。
因为记事本就是那样操作的,建议 lz 还是用api操作文件吧,不行就先用 CreateFileW把文件名全部改正常之后再用open操作。。。。 也是个办法的。。。
因为记事本就是那样操作的,建议 lz 还是用api操作文件吧,不行就先用 CreateFileW把文件名全部改正常之后再用open操作。。。。 也是个办法的。。。
#23
顶
#24
可能只有纯 API 操作了 ............
#25
好象是有专门的查件解决这个问题。。。
#26
lz 能不能说说你要对文件进行什么操作?
如果只是简单的移动,复制之类的,我可以用api简单的给你封装一个函数,供你用,不过分要全给我 :)
说实话,vb的 open put,get 这些文件操作函数,我都没怎么用过
那些api也不是很麻烦,用起来和open差不太多,只是有些地方稍微麻烦点而已
如果只是简单的移动,复制之类的,我可以用api简单的给你封装一个函数,供你用,不过分要全给我 :)
说实话,vb的 open put,get 这些文件操作函数,我都没怎么用过
那些api也不是很麻烦,用起来和open差不太多,只是有些地方稍微麻烦点而已
#27
我要将这个文件改一个名字,但是文件是用户以拖动形式或打开文件对话框选中的
#28
分的话,可以这样,我再开二个VB贴。给您200分,这个贴子别的朋友也参与了讨论,我认为还是应当给大家一些分(虽然实际上有的朋友可能也不在意这点“分”),这样才对得起大家的指点。
#29
修改名字,有规则吗?直接更改名字有可能可以
#30
http://topic.csdn.net/u/20091214/17/c2fb58db-2966-4e13-bce6-662c39d8bc26.html?81866
16楼我已经回复,shrFile = fsoFile.ShortPath得出的文件路径要以直接用或用于改名。
16楼我已经回复,shrFile = fsoFile.ShortPath得出的文件路径要以直接用或用于改名。
#31
http://topic.csdn.net/u/20091214/17/c2fb58db-2966-4e13-bce6-662c39d8bc26.html?81866
16楼我已经回复,shrFile = fsoFile.ShortPath得出的文件路径可以直接使用或用于文件改名。
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
感谢您的指点,但是您的改名代码对我而言有点问题,我不可能要求用户运行程序时必须把所有要处理的文件放在某个目录下(然后用您的程序处理),我只能改用户在打开文件对话框点中的的那个文件的名字。
#34
楼主的 fName.Name = "123456" & ChrB(&H21) + ChrB(&H22) & ".txt" 可能有问题,chrB()函数总是返回一个
单字节,可能是显示∡的原因。用
chrW()试试,它返回的是unicode字符。
#35
这两天忙于别的问题,等周末研究下
#36
........ 还要研究什么,把我给你的代码复制到vb,运行一下不是立刻就知道行不行了吗
#37
放心,能运行另开贴单给您200分。你们大家给这个问题这么多帮助,一点分又怎么足以表达我的谢意呢
#38
#39
LS:估计你白忙忽了!
#41
路过....
#42
转了一圈又一圈,这里面的问题都太高深太专业了,俺只有提问的份,没分时俺咋整呢
#1
是不是权限的问题?
#2
不是,就是文件名中有Unicode字符,CommonDialog1.FileName中变成了一个问号
#3
用:shell("explorer 文件名") 试试
#4
问题出在 chrb 上了,改成 chr 另外不要加空格,windows好像不允许在文件名前后加空格,用系统方法给文件改名加空格时都会被忽略掉
问题的根源在于字符串的内码转换,ascii码和unicode转乱套了
vb的字符串是*使用的,一般情况下不要人工的进行干预转换,如果需要转换则应该是,使用者十分清楚vb在什么情况下转换,何时转换,转换之后的数据到底是什么
问题的根源在于字符串的内码转换,ascii码和unicode转乱套了
vb的字符串是*使用的,一般情况下不要人工的进行干预转换,如果需要转换则应该是,使用者十分清楚vb在什么情况下转换,何时转换,转换之后的数据到底是什么
#5
在Windows下用记事本等,是可以打开这个TXT文件的
#6
把这个文件在Windows下改名为C:\x.txt,也确实就可以在VB中正常访问了。所以可以肯定就是文件名中有某些Unicode字符的问题
#7
问题是vb把文件名按照 unicode 的方式以 open 打开,这样文件名就错了,因为文件名本身的数据就是ansi,unicode混排,vb操作文件名字符串时候,又转了至少1次,所以会导致出问题
你那里文件名显示成什么样? 123!(空格).txt 吗?
你那里文件名显示成什么样? 123!(空格).txt 吗?
#8
ChrB的问题只是我潜的例子,为的是说明这个问题。
现在头疼的问题是,用户那里有一堆文件,名字中有些有Unicode字符,而我的程序打不开这些文件,这个该怎么办?
#9
你把chrb 换成 chr 再试,如果不行,申请一块内存,用系统api的文件选择框获取 ansi 文本的文件名,之后直接用 CreateFileA 打开操作文件,这样应该肯定没问题,前提是,其他一般程序也能打开。。。
#10
对,在DOS模式下看,就是文件名中多了一个空格,而在VB中取得文件名,变成一个问号!
#11
我想是不是RichTextBox1.LoadFile的问题(VB本身应该没有问题)。
试试:先用VB读文件,再传到RichTextBox1中!
试试:先用VB读文件,再传到RichTextBox1中!
#12
或者给文件名加上“”试试!
#13
用下面的语句,选中这个文件:
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下显示的是什么?能不能写一个上来,我们看看
你要打开的文件名在Windows下显示的是什么?能不能写一个上来,我们看看
#18
请看,在Windows中同一个目录下,竟然有两个完全相同的“清单.txt”,其中一个在Dos模式下似乎是多了个空格,而在VB的CommonDialog.FileName中,则变成了“?清单.txt”,然后又不能访问。
请看下图:
#19
包括有Unicode字符的文件我也放在了这里,大家如果愿意,可以下载试试,感谢帮助:
http://www.ynzsjm.com/1.rar
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
摘录 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
#21
楼上的朋友,谢谢您深夜回贴,可是不行啊
#22
用open打开可能确实不太好弄,不过可以肯定的是,CreateFileW绝对没问题。。。。
因为记事本就是那样操作的,建议 lz 还是用api操作文件吧,不行就先用 CreateFileW把文件名全部改正常之后再用open操作。。。。 也是个办法的。。。
因为记事本就是那样操作的,建议 lz 还是用api操作文件吧,不行就先用 CreateFileW把文件名全部改正常之后再用open操作。。。。 也是个办法的。。。
#23
顶
#24
可能只有纯 API 操作了 ............
#25
好象是有专门的查件解决这个问题。。。
#26
lz 能不能说说你要对文件进行什么操作?
如果只是简单的移动,复制之类的,我可以用api简单的给你封装一个函数,供你用,不过分要全给我 :)
说实话,vb的 open put,get 这些文件操作函数,我都没怎么用过
那些api也不是很麻烦,用起来和open差不太多,只是有些地方稍微麻烦点而已
如果只是简单的移动,复制之类的,我可以用api简单的给你封装一个函数,供你用,不过分要全给我 :)
说实话,vb的 open put,get 这些文件操作函数,我都没怎么用过
那些api也不是很麻烦,用起来和open差不太多,只是有些地方稍微麻烦点而已
#27
我要将这个文件改一个名字,但是文件是用户以拖动形式或打开文件对话框选中的
#28
分的话,可以这样,我再开二个VB贴。给您200分,这个贴子别的朋友也参与了讨论,我认为还是应当给大家一些分(虽然实际上有的朋友可能也不在意这点“分”),这样才对得起大家的指点。
#29
修改名字,有规则吗?直接更改名字有可能可以
#30
http://topic.csdn.net/u/20091214/17/c2fb58db-2966-4e13-bce6-662c39d8bc26.html?81866
16楼我已经回复,shrFile = fsoFile.ShortPath得出的文件路径要以直接用或用于改名。
16楼我已经回复,shrFile = fsoFile.ShortPath得出的文件路径要以直接用或用于改名。
#31
http://topic.csdn.net/u/20091214/17/c2fb58db-2966-4e13-bce6-662c39d8bc26.html?81866
16楼我已经回复,shrFile = fsoFile.ShortPath得出的文件路径可以直接使用或用于文件改名。
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
感谢您的指点,但是您的改名代码对我而言有点问题,我不可能要求用户运行程序时必须把所有要处理的文件放在某个目录下(然后用您的程序处理),我只能改用户在打开文件对话框点中的的那个文件的名字。
#34
楼主的 fName.Name = "123456" & ChrB(&H21) + ChrB(&H22) & ".txt" 可能有问题,chrB()函数总是返回一个
单字节,可能是显示∡的原因。用
chrW()试试,它返回的是unicode字符。
#35
这两天忙于别的问题,等周末研究下
#36
........ 还要研究什么,把我给你的代码复制到vb,运行一下不是立刻就知道行不行了吗
#37
放心,能运行另开贴单给您200分。你们大家给这个问题这么多帮助,一点分又怎么足以表达我的谢意呢
#38
#39
LS:估计你白忙忽了!
#40
#41
路过....
#42
转了一圈又一圈,这里面的问题都太高深太专业了,俺只有提问的份,没分时俺咋整呢