Ces fonctions permettent de vérifier si un fichier est déjà ouvert/utilisé par une autre application.
La dernière version permet même de retourner les fichiers utilisés par un processus.
Première version par Siao (http://www.autoitscript.com/forum/topic ... _p__410020) :
Code : Tout sélectionner
;===============================================================================
;
; 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
Code : Tout sélectionner
#Include <WinAPI.au3>
Func _FileIsUses($sFile)
Local $hFile = _WinAPI_CreateFile($sFile, 2, 2, 0)
If $hFile Then
_WinAPI_CloseHandle($hFile)
Return 0
EndIf
Local $Error = _WinAPI_GetLastError()
Switch $Error
Case 32 ; ERROR_SHARING_VIOLATION
Return 1
Case Else
Return SetError($Error, 0, 0)
EndSwitch
EndFunc ;==>_FileIsUses
Code : Tout sélectionner
;##############################################################################################
; FileInUseInfo - Modify it for your needs
;
; example $mode = 1; FileInUseInfo("AutoIt3.exe", 1) ;returns file(s) used by process
;
; example $mode = 2; FileInUseInfo("SomeFile.txt", 2) ;returns process(s) using file
;##############################################################################################
Func FileInUseInfo($sInput, $mode = 1, $strComputer = "localhost")
Local $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
If @error Then Return SetError(-1)
Local $output = '', $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_Process", "WQL", 0x10 + 0x20)
If Not IsObj($colItems) Then Return SetError(-2)
For $objItem In $colItems
If $objItem.CommandLine = '' Or StringLeft($objItem.CommandLine, 1) = '\' Then ContinueLoop
If $mode = 1 And $objItem.Name = $sInput Then
ElseIf $mode = 2 And StringInStr($objItem.CommandLine, $sInput) Then
Else
ContinueLoop
EndIf
$output &= "PID: " & $objItem.ProcessId & @CRLF
$output &= "CommandLine: " & $objItem.CommandLine & @CRLF & @CRLF
Next
Return $output
EndFunc