bhffhzh 发表于 2015-9-6 18:22:50

[已解决]求方法:动态检查路径合法性,不管路径是否存在

本帖最后由 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

user030 发表于 2015-9-7 01:07:06

实在找不到能识别单个字母的正则方法,只能瞎搞一个出来,应该勉强满足要求的吧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

bhffhzh 发表于 2015-9-7 07:17:39

回复 2# user030


    你这似乎也是静态判断。

bhffhzh 发表于 2015-9-7 07:24:48

本帖最后由 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

user030 发表于 2015-9-7 09:02:01

回复 3# bhffhzh


    看了你下面的代码,_PathValidateCheck1()函数的处理可以试下换成我那种判断方法。
    你目前遇到的难题应该不是动态与静态,是正则的应用不起作用而已,我弄那个正则也花了不少时间,但au3里面的正则对于单个单词的判断几乎没有,我就换其他方法来进行判断路径了,实在不想花费太多时间在一件能采用其他方法可以解决的事情上。

Alam 发表于 2015-9-7 09:58:54

我只会简单的:能创建的,路径就是对的!#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 10:50:55

本帖最后由 水木子 于 2015-9-7 11:01 编辑

回复 6# Alam

好思路,学习了!

不过你这个有点小问题需要注意下,假如指定路径已经存在呢!
原本存在的路径会被删除哦!所以还需要优化下。

bhffhzh 发表于 2015-9-7 13:26:07

本帖最后由 bhffhzh 于 2015-9-7 13:28 编辑

回复 5# user030


我要的就是其它方法,我的方法太另类,而且用
while 1
   Sleep(500)
wend

很是占用内存。我说了这种方法非常不可取。。

bhffhzh 发表于 2015-9-7 13:37:48

本帖最后由 bhffhzh 于 2015-9-7 14:32 编辑

回复 7# 水木子


我问题的关键是如何在输入框手动输入地址后,程序立即就响应地址是否合法。
而不需要通过诸如点击按钮去响应。


水木子 发表于 2015-9-7 19:30:17

回复 9# bhffhzh

6楼代码,不就是你要的效果么?

bhffhzh 发表于 2015-9-7 21:01:18

本帖最后由 bhffhzh 于 2015-9-7 21:03 编辑

回复 10# 水木子


我再测试一下。

user030 发表于 2015-9-8 22:32:12

回复 8# bhffhzh

sorry,我错了
话说 6楼的那种做法LZ验证通过了没?

bhffhzh 发表于 2015-9-8 22:44:48

似乎可以哟,之前没仔细看。这两天有事,空了好生测试。
感谢关注
页: [1]
查看完整版本: [已解决]求方法:动态检查路径合法性,不管路径是否存在