首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • VB关于处理含有中文或长文件名格式的路径 [已结贴,结贴人:paullbm]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • paullbm
    • 等级:
    发表于:2008-03-22 22:18:11 楼主
    各位大哥,小弟在写一个文件操作方面的小程序....

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

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


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


    高分相送,望不吝赐教!!!
    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-22 22:27:561楼 得分:5
    GetShortPath ???
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-22 22:33:032楼 得分:30
    VB.NET code
    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

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-22 22:34:533楼 得分:15
    '转换为短路径名

    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

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • paullbm
    • 等级:
    发表于:2008-03-22 22:35:424楼 得分:0
    我用的不是vb.net
    用的是vb6.0
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-22 22:37:135楼 得分:0
    试了一下,这个应该没错。

    VBScript code
    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
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • paullbm
    • 等级:
    发表于:2008-03-22 23:20:026楼 得分:0
    请问那个165和164是什么意思?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • paullbm
    • 等级:
    发表于:2008-03-22 23:34:557楼 得分:0
    还是有问题....

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

    而我希望文件不存在的话,也能得到短文件格式的完整路径....
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • myjian
    • 等级:
    发表于:2008-03-22 23:36:508楼 得分:20
    165,那是缓冲区长度

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

    API要好好学.

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

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

    打开后看楼顶"API三把枪"
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • myjian
    • 等级:
    发表于:2008-03-22 23:42:189楼 得分:10
    引用 7 楼 paullbm 的回复:
    还是有问题.... 

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

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


    传入路径就可以了,不需要带文件名.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • paullbm
    • 等级:
    发表于:2008-03-22 23:45:2110楼 得分:0
    引用 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 的回复:
    传入路径就可以了,不需要带文件名.



    我也想这样,但是这样会变得更加麻烦.......
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • paullbm
    • 等级:
    发表于:2008-03-23 00:05:1411楼 得分:0
    一切某个物理存在的含有长文件名或中文的路径的字符串被这个函数处理之后,
    再用字符串连接符号'&' 连接一个新的字符串之后,效果和没连接一样....


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

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

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • myjian
    • 等级:
    发表于:2008-03-23 00:15:2212楼 得分:5
    那你自己实现一个这API吧

    也不是很复杂.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • paullbm
    • 等级:
    发表于:2008-03-23 00:34:1313楼 得分:0
    哈哈.经过不断努力摸索,终于找到了一种方法能够实现自己想要的效果.


    谢谢各位大哥的指点!!!!!!!!!!!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • paullbm
    • 等级:
    发表于:2008-03-23 11:01:5414楼 得分:0
    顺便再问一个问题:

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

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

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

    请问各位大哥如何做...
    这个问题解决之后就结贴!!!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • myjian
    • 等级:
    发表于:2008-03-23 11:10:5115楼 得分:5
    调用相应窗体的SetFocus试下吧.

    多看书.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • paullbm
    • 等级:
    发表于:2008-03-23 11:14:2016楼 得分:0
    调用了setfocus啊,但对MDI下的子窗体无效!!!!!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-03-23 11:18:1117楼 得分:10
    设置对应窗体的zorder 0
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • paullbm
    • 等级:
    发表于:2008-03-23 11:32:1618楼 得分:0
    OK,设置焦点的问题也已经解决...

    现在结贴!!!

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

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    世纪乐知(北京)网络技术有限公司 版权所有 京 ICP 证 020026 号
    Copyright © 2000-2007, CSDN.NET, All Rights Reserved