VB关于处理含有中文或长文件名格式的路径

时间:2022-08-09 05:55:41
各位大哥,小弟在写一个文件操作方面的小程序....

生成的.exe文件在符合8.3dos格式文件的目录下运行时,一切正常....

但是一旦把它放在含有中文或其路径中单个文件夹的名称的字符串大于8的时候,程序就一律报错....


请问能有什么好的方法解决小弟的这种要求吗>???
小弟的思路是对长文件名进行单个文件夹名称的截取,然后将其进行8.3格式的转换....
但是含有中文的话,小弟就没辙了.....


高分相送,望不吝赐教!!!

18 个解决方案

#1


GetShortPath ???

#2


Option Explicit

  Private Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long
    
  Private Sub Command1_Click()
          Dim StrCommand     As String
            
          StrCommand = GetShortPath("C:\Program Files\装机人员工具\C盘转换为NTFS格式.cmd")
          'result = Shell(StrCommand, vbHide)
            
  End Sub
    
  Public Function GetShortPath(strFileName As String) As String
          Dim lngRes     As Long, strPath       As String
          '创建存储路径的缓冲区
          strPath = String$(165, 0)
          '获得一个短文件(路径)名
          lngRes = GetShortPathName(strFileName, strPath, 164)
          '清除建立缓冲区时多余的   chr$(0)
          GetShortPath = Left$(strPath, lngRes)
  End Function

#3


'转换为短路径名

Private Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long
Private Sub Command1_Click()
   MsgBox GetShortName("d:\Program Files\TENCENT\qq\QQ.exe")
End Sub

Public Function GetShortName(ByVal sLongFileName As String) As String
   Dim lRetVal&, sShortPathName$
   sShortPathName = Space(255)
   Call GetShortPathName(sLongFileName, sShortPathName, 255)
   GetShortName = Mid(sShortPathName, 1, InStr(sShortPathName, Chr(0)) - 1)
End Function

VB关于处理含有中文或长文件名格式的路径

#4


我用的不是vb.net
用的是vb6.0

#5


试了一下,这个应该没错。

Option Explicit

Private Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long
  
Private Sub Command1_Click()
    Dim StrCommand     As String
    
    StrCommand = GetShortPath("C:\Program Files\装机人员工具\C盘转换为NTFS格式.cmd")
    'result = Shell(StrCommand, vbHide)

End Sub
    
Public Function GetShortPath(strFileName As String) As String
    Dim lngRes     As Long, strPath       As String
    '创建存储路径的缓冲区
    strPath = String$(165, 0)
    '获得一个短文件(路径)名
    lngRes = GetShortPathName(strFileName, strPath, 164)
    '清除建立缓冲区时多余的   chr$(0)
    lngRes = InStr(1, strPath, Chr$(0))
    GetShortPath = Mid(strPath, 1, lngRes - 1)
End Function

#6


请问那个165和164是什么意思?

#7


还是有问题....

如果一个文件不是物理存在的话,那么经过此函数处理的字符将为空....

而我希望文件不存在的话,也能得到短文件格式的完整路径....

#8


165,那是缓冲区长度

164,是告诉API,我的缓冲区有164个长度(165是为了装上最后一个/0)

API要好好学.

推荐三个API工具,其中一个有不少的API例子:

http://www.m5home.com/bbs/dispbbs.asp?boardID=10&ID=265&page=1

打开后看楼顶"API三把枪"

#9


引用 7 楼 paullbm 的回复:
还是有问题.... 

如果一个文件不是物理存在的话,那么经过此函数处理的字符将为空.... 

而我希望文件不存在的话,也能得到短文件格式的完整路径....


传入路径就可以了,不需要带文件名.

#10


引用 8 楼 myjian 的回复:
165,那是缓冲区长度 

164,是告诉API,我的缓冲区有164个长度(165是为了装上最后一个/0) 

API要好好学. 

推荐三个API工具,其中一个有不少的API例子: 

http://www.m5home.com/bbs/dispbbs.asp?boardID=10&ID=265&page=1 

打开后看楼顶"API三把枪"


谢谢指点........


引用 9 楼 myjian 的回复:
传入路径就可以了,不需要带文件名.



我也想这样,但是这样会变得更加麻烦.......

#11


一切某个物理存在的含有长文件名或中文的路径的字符串被这个函数处理之后,
再用字符串连接符号'&' 连接一个新的字符串之后,效果和没连接一样....


而我想在后面再连接....

并且我想要的效果是将一个新建的文件存放在一个物理存在的含有长文件名或中文的路径,
但如果只传入路径的话,效果就是我上面所说的效果..这并不是我想要的.....

#12


那你自己实现一个这API吧

也不是很复杂.

#13


哈哈.经过不断努力摸索,终于找到了一种方法能够实现自己想要的效果.


谢谢各位大哥的指点!!!!!!!!!!!

#14


顺便再问一个问题:

在VB6中如何让MDI子窗体获得焦点...

比如子窗体有form1,form2
当我单击主窗体菜单上的A按钮,弹出form1,然后再按B按钮,弹出form2
这时,二个子窗体都已经打开...如果此时我继续按A按钮,但发现,焦点还是在form2上...

我希望在任何时候只要是按A时,form1就得到焦点;按B时,form2就得到焦点...

请问各位大哥如何做...
这个问题解决之后就结贴!!!

#15


调用相应窗体的SetFocus试下吧.

多看书.

#16


调用了setfocus啊,但对MDI下的子窗体无效!!!!!

#17


设置对应窗体的zorder 0

#18


OK,设置焦点的问题也已经解决...

现在结贴!!!

顺便还有一个88分的贴子,还没得到满意答复!!
如下:
http://topic.csdn.net/u/20080317/22/74477137-9295-408d-979a-b14c08a49705.html

#1


GetShortPath ???

#2


Option Explicit

  Private Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long
    
  Private Sub Command1_Click()
          Dim StrCommand     As String
            
          StrCommand = GetShortPath("C:\Program Files\装机人员工具\C盘转换为NTFS格式.cmd")
          'result = Shell(StrCommand, vbHide)
            
  End Sub
    
  Public Function GetShortPath(strFileName As String) As String
          Dim lngRes     As Long, strPath       As String
          '创建存储路径的缓冲区
          strPath = String$(165, 0)
          '获得一个短文件(路径)名
          lngRes = GetShortPathName(strFileName, strPath, 164)
          '清除建立缓冲区时多余的   chr$(0)
          GetShortPath = Left$(strPath, lngRes)
  End Function

#3


'转换为短路径名

Private Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long
Private Sub Command1_Click()
   MsgBox GetShortName("d:\Program Files\TENCENT\qq\QQ.exe")
End Sub

Public Function GetShortName(ByVal sLongFileName As String) As String
   Dim lRetVal&, sShortPathName$
   sShortPathName = Space(255)
   Call GetShortPathName(sLongFileName, sShortPathName, 255)
   GetShortName = Mid(sShortPathName, 1, InStr(sShortPathName, Chr(0)) - 1)
End Function

VB关于处理含有中文或长文件名格式的路径

#4


我用的不是vb.net
用的是vb6.0

#5


试了一下,这个应该没错。

Option Explicit

Private Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long
  
Private Sub Command1_Click()
    Dim StrCommand     As String
    
    StrCommand = GetShortPath("C:\Program Files\装机人员工具\C盘转换为NTFS格式.cmd")
    'result = Shell(StrCommand, vbHide)

End Sub
    
Public Function GetShortPath(strFileName As String) As String
    Dim lngRes     As Long, strPath       As String
    '创建存储路径的缓冲区
    strPath = String$(165, 0)
    '获得一个短文件(路径)名
    lngRes = GetShortPathName(strFileName, strPath, 164)
    '清除建立缓冲区时多余的   chr$(0)
    lngRes = InStr(1, strPath, Chr$(0))
    GetShortPath = Mid(strPath, 1, lngRes - 1)
End Function

#6


请问那个165和164是什么意思?

#7


还是有问题....

如果一个文件不是物理存在的话,那么经过此函数处理的字符将为空....

而我希望文件不存在的话,也能得到短文件格式的完整路径....

#8


165,那是缓冲区长度

164,是告诉API,我的缓冲区有164个长度(165是为了装上最后一个/0)

API要好好学.

推荐三个API工具,其中一个有不少的API例子:

http://www.m5home.com/bbs/dispbbs.asp?boardID=10&ID=265&page=1

打开后看楼顶"API三把枪"

#9


引用 7 楼 paullbm 的回复:
还是有问题.... 

如果一个文件不是物理存在的话,那么经过此函数处理的字符将为空.... 

而我希望文件不存在的话,也能得到短文件格式的完整路径....


传入路径就可以了,不需要带文件名.

#10


引用 8 楼 myjian 的回复:
165,那是缓冲区长度 

164,是告诉API,我的缓冲区有164个长度(165是为了装上最后一个/0) 

API要好好学. 

推荐三个API工具,其中一个有不少的API例子: 

http://www.m5home.com/bbs/dispbbs.asp?boardID=10&ID=265&page=1 

打开后看楼顶"API三把枪"


谢谢指点........


引用 9 楼 myjian 的回复:
传入路径就可以了,不需要带文件名.



我也想这样,但是这样会变得更加麻烦.......

#11


一切某个物理存在的含有长文件名或中文的路径的字符串被这个函数处理之后,
再用字符串连接符号'&' 连接一个新的字符串之后,效果和没连接一样....


而我想在后面再连接....

并且我想要的效果是将一个新建的文件存放在一个物理存在的含有长文件名或中文的路径,
但如果只传入路径的话,效果就是我上面所说的效果..这并不是我想要的.....

#12


那你自己实现一个这API吧

也不是很复杂.

#13


哈哈.经过不断努力摸索,终于找到了一种方法能够实现自己想要的效果.


谢谢各位大哥的指点!!!!!!!!!!!

#14


顺便再问一个问题:

在VB6中如何让MDI子窗体获得焦点...

比如子窗体有form1,form2
当我单击主窗体菜单上的A按钮,弹出form1,然后再按B按钮,弹出form2
这时,二个子窗体都已经打开...如果此时我继续按A按钮,但发现,焦点还是在form2上...

我希望在任何时候只要是按A时,form1就得到焦点;按B时,form2就得到焦点...

请问各位大哥如何做...
这个问题解决之后就结贴!!!

#15


调用相应窗体的SetFocus试下吧.

多看书.

#16


调用了setfocus啊,但对MDI下的子窗体无效!!!!!

#17


设置对应窗体的zorder 0

#18


OK,设置焦点的问题也已经解决...

现在结贴!!!

顺便还有一个88分的贴子,还没得到满意答复!!
如下:
http://topic.csdn.net/u/20080317/22/74477137-9295-408d-979a-b14c08a49705.html