[已解决]求方法:动态检查路径合法性,不管路径是否存在
本帖最后由 bhffhzh 于 2015-9-11 19:24 编辑综合相关贴子,如下代码似乎可以判断,但我要求是能在输入框动态修改也能判断,一直头疼。
需要如果功能:
以下代码是通过浏览按钮实现的代码:
$Search1 = FileSelectFolder("请选择一个文件夹:", "", 1)
If StringRegExp($Search1, "[^\x00-\xff]") Or $Search1 = "" Then ;判断路径是否有中文或返回空值
MsgBox(16, "警告", "路径必须指定正确并且不能含中文或特殊字符,请修改后执行!")
Else
GUICtrlSetData($Input1, $Search1)
GUICtrlRead($Input1)
EndIf
实在找不到能识别单个字母的正则方法,只能瞎搞一个出来,应该勉强满足要求的吧Local $url,$regExp,$URLarry
$url = "C:\Users\hulu\Desktop\AutoIt"
;~ $url = "C:\Users\hulu\Desktop\AutoIt?%\"
;~ $url = "CcCcC:\Users\hulu\Desktop\AutoIt"
;~ $url = "123:\Users\hulu\Desktop\AutoIt"
;~ $url = "ab"
$URLarry = StringSplit($url,":\",1) ;根据路径中都会唯一存在的字符串":\"进行分割
For $i=0 To UBound($URLarry)-1 ;只是打印分割后的数组元素而已
ConsoleWrite($i &"-->"& $URLarry[$i] & @CR)
Next
If UBound($URLarry)=3 Then ;根据数组元素的个数,判断是否存在":\",而断定路径格式是否有错
If StringLen($URLarry)=1 And StringRegExp($URLarry,"") Then;判断盘符是否为一个英文单词,从而判断盘符的正确性
ConsoleWrite("URL的盘符准确。盘符为:"& $URLarry & @CR)
If StringRegExp($URLarry, "[^\x00-\xff]") Or $URLarry = "" Then
ConsoleWrite("URL的具体路径错误,路径必须指定正确并且不能含中文或特殊字符。路径为:"& $url & @CR)
ElseIf StringRegExp($URLarry, "") Then;判断路径是否有中文或返回空值
ConsoleWrite("URL的具体路径正确。路径为:"& $url & @CR)
Else
ConsoleWrite("URL的具体路径出现未知情况,请检查。路径为:"& $url & @CR)
EndIf
Else
ConsoleWrite("URL的盘符出错,请检查。盘符为:"& $URLarry & @CR)
EndIf
Else
ConsoleWrite("路径格式出错,请检查:"& $url & @CR)
EndIf 回复 2# user030
你这似乎也是静态判断。 本帖最后由 bhffhzh 于 2015-9-7 13:32 编辑
我用一个另类的方法让大家知道我的想法吧。
大家运行就知道了,当然这种方法实在不可取。
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 623, 442, 192, 124)
$Input1 = GUICtrlCreateInput("c:\", 80, 176, 297, 21)
$Button1 = GUICtrlCreateButton("Button1", 336, 280, 89, 49)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
$Search11 = GUICtrlRead($Input1)
$hzh = StringMid($Search11, 1, 3) ;提取路径的前三个字符
$iFileExists1 = FileExists($hzh) ;检查文件或目录是否存在,这里其实是检查诸如是否存在c:盘 d:盘之类的。
If $iFileExists1 = 0 Or _PathValidateCheck1($Search11, 1) = 0 Or StringRegExp($Search11, "[^\x00-\xff]") Then ;盘符不对,路径含中文,不符合Windows文件命名规则 均不执行。
GUICtrlSetState($Button1, $GUI_DISABLE)
MsgBox(0,0,"不合法")
Else
GUICtrlSetState($Button1, $GUI_ENABLE)
MsgBox(0,0,"合法")
EndIf
Sleep(500)
WEnd
;验证安装目录路径
Func _PathValidateCheck1($Search11, $OnlyAbsolutePath = 0)
;afan提示:验证路径是否合法(路径可不存在)。
; 本函数可用于验证用户提供的路径是否合法有效。
; 与 FileExists 用途不同,FileExists 验证的路径必须存在,而本函数路径可不存在,只要符合Windows文件命名规则即可。
;$sPath - 待验证的路径字符串
;$OnlyAbsolutePath - 仅验证绝对路径
;返回值 - 合法返回1;非法返回0,并设置@Error非0。
If $OnlyAbsolutePath And Not StringRegExp($Search11, '^:') Then Return SetError(1, 0, 0)
Local $aSR1 = StringRegExp($Search11, '^(.*?)([^\\/]+)\\?
, 1)
If @error Then Return SetError(2, 0, 0)
If StringLen($aSR1) >= 248 Or StringLen($aSR1) >= 260 Then Return SetError(2, 0, 0)
If StringRegExp($Search11, '[[:cntrl:]]') Then Return SetError(3, 0, 0)
Local $sIns = '?'
If $OnlyAbsolutePath Then $sIns = ''
If StringRegExp($Search11, '^(?::\\?|(:\\)' & $sIns & '(\S[^\\/:*?"<>|]*(?<!\s)\\)*\S[^\\/:*?"<>|]*(?<!\s)\\?)
) Then Return 1
Return SetError(4, 0, 0)
EndFunc ;==>_PathValidateCheck1 回复 3# bhffhzh
看了你下面的代码,_PathValidateCheck1()函数的处理可以试下换成我那种判断方法。
你目前遇到的难题应该不是动态与静态,是正则的应用不起作用而已,我弄那个正则也花了不少时间,但au3里面的正则对于单个单词的判断几乎没有,我就换其他方法来进行判断路径了,实在不想花费太多时间在一件能采用其他方法可以解决的事情上。 我只会简单的:能创建的,路径就是对的!#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
$Form1 = GUICreate("Form1", 623, 442, 192, 124)
$Input1 = GUICtrlCreateInput("c:\", 80, 176, 297, 21)
$Button1 = GUICtrlCreateButton("Button1", 336, 280, 89, 49)
GUIRegisterMsg($WM_COMMAND, "MY_WM_COMMAND")
GUISetState(@SW_SHOW)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
Func MY_WM_COMMAND($hWnd, $msg, $wParam, $lParam)
Local $nCode = BitShift($wParam, 16)
Local $ID = BitAND($wParam, 0x0000FFFF)
If $ID <>$Input1 Then Return
If $nCode = $EN_CHANGE Then
;MsgBox(16, '', '')
If _PathValidateCheck(GUICtrlRead($Input1))= 0 Then
GUICtrlSetState($Button1, $GUI_DISABLE)
Else
GUICtrlSetState($Button1, $GUI_ENABLE)
EndIf
EndIf
EndFunc
Func _PathValidateCheck($sPath)
Local $iRe = 0
If DirCreate($sPath) Then $iRe = 1
DirRemove($sPath)
Return $iRe
EndFunc ;==>_PathValidateCheck 本帖最后由 水木子 于 2015-9-7 11:01 编辑
回复 6# Alam
好思路,学习了!
不过你这个有点小问题需要注意下,假如指定路径已经存在呢!
原本存在的路径会被删除哦!所以还需要优化下。 本帖最后由 bhffhzh 于 2015-9-7 13:28 编辑
回复 5# user030
我要的就是其它方法,我的方法太另类,而且用
while 1
Sleep(500)
wend
很是占用内存。我说了这种方法非常不可取。。 本帖最后由 bhffhzh 于 2015-9-7 14:32 编辑
回复 7# 水木子
我问题的关键是如何在输入框手动输入地址后,程序立即就响应地址是否合法。
而不需要通过诸如点击按钮去响应。
回复 9# bhffhzh
6楼代码,不就是你要的效果么? 本帖最后由 bhffhzh 于 2015-9-7 21:03 编辑
回复 10# 水木子
我再测试一下。 回复 8# bhffhzh
sorry,我错了
话说 6楼的那种做法LZ验证通过了没? 似乎可以哟,之前没仔细看。这两天有事,空了好生测试。
感谢关注
页:
[1]