独占锁定文件检测AutoIt

时间:2010-12-22 17:23:08

标签: autoit

如何检查文件是否在AutoIt中被独占锁定?我不是在谈论读/写访问。此外,我做了一些研究,如果文件被锁定,它不会显示在任务管理器进程列表中。

一个例子是在Perl中称为flock: 你检查文件是否通过$ theRC = flock锁定($ HANDLE,LOCK_EX | LOCK_NB);

我试图在AutoIt中复制它。

我找到了一个有效的解决方案:

Local $f = "C:/log.txt"

MsgBox(0, _FileInUse($f), @error)

;===============================================================================
;
; Function Name:    _FileInUse()
; Description:      Checks if file is in use
; Parameter(s):     $sFilename = File name
; Return Value(s):  1 - file in use (@error contains system error code)
;                   0 - file not in use
;
;===============================================================================
Func _FileInUse($sFilename)
    Local $aRet, $hFile
    $aRet = DllCall("Kernel32.dll", "hwnd", "CreateFile", _
                                    "str", $sFilename, _ ;lpFileName
                                    "dword", 0x80000000, _ ;dwDesiredAccess = GENERIC_READ
                                    "dword", 0, _ ;dwShareMode = DO NOT SHARE
                                    "dword", 0, _ ;lpSecurityAttributes = NULL
                                    "dword", 3, _ ;dwCreationDisposition = OPEN_EXISTING
                                    "dword", 128, _ ;dwFlagsAndAttributes = FILE_ATTRIBUTE_NORMAL
                                    "hwnd", 0) ;hTemplateFile = NULL
    $hFile = $aRet[0]
    If $hFile = -1 Then ;INVALID_HANDLE_VALUE = -1
        $aRet = DllCall("Kernel32.dll", "int", "GetLastError")
        SetError($aRet[0])
        Return 1
    Else
        ;close file handle
        DllCall("Kernel32.dll", "int", "CloseHandle", "hwnd", $hFile)
        Return 0
    EndIf
EndFunc

1 个答案:

答案 0 :(得分:1)

这应该可以解决问题:

Func FileInUse($filename)
    $handle = FileOpen($filename, 1)

    $result = False
    if $handle = -1 then $result = True

    FileClose($handle)

    return $result
EndFunc

;~ usage
$filename = "C:\Windu15f.exe"
if FileInUse($filename) Then
    MsgBox(0, "", "File is in use")
Else
    MsgBox(0, "", "Not in use - go nuts")
EndIf