VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
查看: 4904|回复: 15

[经验技巧] FileListbox控件的路径要求比Open严格

[复制链接]
 楼主| 发表于 2012-1-15 01:16:15 | 显示全部楼层 |阅读模式
本帖最后由 VBProFan 于 2012-1-16 08:26 编辑

原标题:又发现IDE和编译后的一个区别,路径双斜杠是否错误

原内容:
FileListbox控件的属性

File1.Path = “xxx”

如果含有 \\,在 IDE 没事,编译后就报错。


FileListbox控件的路径不允许双反斜杠(右斜杠)或单斜杠(左斜杠),Open就可以。前者是严格的 Windows 路径语法,后者为了容错,估计内部实现中首先对路径字符串做了预处理。

点评

我也错,你什么系统?  发表于 2012-1-15 19:30
我这里在IDE里面也报错  发表于 2012-1-15 14:07
发表于 2012-1-15 19:50:03 | 显示全部楼层
好像只是FileListBox有这个问题,Open就不报错

点评

Open当然不报错,你写成Open "C:\/\\\\/\/\/\\/\/\/\//\/\/Windows\/\/\\\//\/\/\\\/\/\/\/\/\/System32\\\\/\/\/\\/\/\/\/\/////\/\/\/..."都没问题  发表于 2012-1-15 22:53
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-1-15 23:30:01 | 显示全部楼层
灵异,我昨晚试的时候 IDE 明明是可以通过的,今晚试又报错了,同一个程序……
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-1-16 08:20:03 | 显示全部楼层
我知道了,是我原来眼花了,我写了个程序来适应IDE和编译两种情况,使他们可以共用同样的资源文件:
gsAppPath = App.Path & IIf(App.LogMode = 0, "\Release", "\")
但后面写了
gsAppPath & "\Data\" & msCurClass
所以 IDE 下正常,编译后就有 \\Data 所以报错了。不过之前我知道 Open 里多少个 \ 都没事,FileListBox 的错误确实让我吃了一惊。也算是一个发现吧,改标题去

点评

所以我从不用FileListBox等控件的飘过,一是这些控件长得太难看,二是功能也很烂  发表于 2012-1-16 14:39
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-1-16 08:39:02 | 显示全部楼层
acme_pjz  Open当然不报错,你写成Open "C:\/\\\\/\/\/\\/\/\/\//\/\/Windows\/\/\\\//\/\/\\\/\/\/\/\/\/System32\\\\/\/\/\\/\/\/\/\/////\/\/\/..."都没问题


首先 sInputPath = Replace(sInputPath, "/", "\")
然后用 DFA 合并一下多个“\”为一个。
回复 支持 反对

使用道具 举报

发表于 2012-1-16 11:26:00 | 显示全部楼层
不管是在IDE还是编译后我 都是直接
gsAppPath = App.Path & "\"
只要工程保存了。AppPath 就是 工程的路径

点评

程序放在C:\根目录下就会变成“C:\\”了,不过Open等确实还是没问题的  发表于 2012-1-16 14:38
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-1-16 12:17:57 | 显示全部楼层
19900603 发表于 2012-1-16 11:26
不管是在IDE还是编译后我 都是直接
gsAppPath = App.Path & "\"
只要工程保存了。AppPath 就是 工程的路 ...

我是为了方便发布软件,exe 放在工程下的一个目录中,所以调试和实际运行时的路径是不同的。
回复 支持 反对

使用道具 举报

发表于 2012-1-16 16:13:14 | 显示全部楼层
本帖最后由 阳光宝宝 于 2012-1-16 16:14 编辑

用 DFA 合并一下多个“\”为一个是什么意思,我不懂

我原来是用while wend 循环查找替换的,难到还有更简单的办法?

点评

DFA=确定性有限状态自动机。只需扫描一遍即可。While 岂不是要扫描很多遍?  发表于 2012-1-16 16:22
回复 支持 反对

使用道具 举报

发表于 2012-1-16 20:44:00 | 显示全部楼层
能给个示例吗?
比如有字串a="143 344     343   676 789         983"
替换成:b="143 344 343 676 789 983"
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-1-16 22:36:36 | 显示全部楼层
随手写了一下,几个简单的测试,没发现问题。
  1. Option Explicit

  2. Private Enum emState
  3.   c_Init
  4.   c_Slash
  5.   c_NonSlash
  6. End Enum

  7. Private Function TransStr(s As String) As String
  8.   Dim t As String
  9.   Dim i As Byte
  10.   Dim Ch As String
  11.   Dim st As emState
  12.   
  13.   st = c_Init
  14.   t = ""
  15.   
  16.   For i = 1 To Len(s)
  17.     Ch = Mid(s, i, 1)
  18.     Select Case st
  19.       Case c_Init
  20.         If Ch = "" Then
  21.           st = c_Slash
  22.         Else
  23.           st = c_NonSlash
  24.         End If
  25.         t = t & Ch
  26.       Case c_Slash
  27.         If Ch <> "" Then
  28.           st = c_NonSlash
  29.           t = t & Ch
  30.         End If
  31.       Case c_NonSlash
  32.         If Ch = "" Then
  33.           st = c_Slash
  34.         End If
  35.         t = t & Ch
  36.     End Select
  37.   Next i
  38.   
  39.   TransStr = t
  40. End Function

  41. Private Sub Form_Load()
  42.   Debug.Print TransStr("C:\abc\\\def\\ghijk\lmn\\\\opq\rs\\\\")
  43.   Unload Me
  44. End Sub
复制代码
输出:
C:\abc\def\ghijk\lmn\opq\rs\

点评

我重在说明 FA 的思想。还有 mid 也是可以用 byte 数组来加速的  发表于 2012-1-16 23:29
字符串连接t = t & Ch就能慢死,C/C++里面是直接操作Byte数组  发表于 2012-1-16 22:48
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2022-7-3 01:46

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表