Обнаружение исключительно заблокированных файлов 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

person Christopher Peterson    schedule 22.12.2010    source источник
comment
Ба нет синтаксиса бота для autoit?   -  person Christopher Peterson    schedule 22.12.2010
comment
Выделите свой код и щелкните значок {} на панели инструментов редактора.   -  person aphoria    schedule 23.12.2010


Ответы (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
person Fidel    schedule 24.10.2011
comment
На самом деле, Windows/NTFS (не знаю, какая именно) позволяют разным программам одновременно открывать дескриптор одного и того же файла. Если вы можете получить эту блокировку через FileOpen, другие программы все еще могут открывать файл в режиме чтения. - person Jos van Egmond; 25.10.2011