xiaosen666m 发表于 2010-8-26 12:23:24

判斷文件是否正在使用

如何判斷文件是否正在使用,期盼高手解答

xsjtxy 发表于 2010-8-26 12:53:15

先复制一个。然后删除。看看成不成功。
成功就没在用。把备份的复制回来。
没成功就在用。把备份的删除。

zzz867 发表于 2010-8-26 14:35:06

之前也想過這個問題,但尚沒有確切有效的辦法,樓上的如果處理小文件可能還行,但如果1G或者更大的呢?

pusofalse 发表于 2010-8-26 15:17:54

一个文件若正在被使用,在使用者的进程空间中必然有这个文件的句柄,NtQuerySystemInformation可以枚举系统中的所有句柄,NtQueryObject取得句柄的对象名称。

liufenglg 发表于 2010-8-26 15:43:10

一个文件若正在被使用,在使用者的进程空间中必然有这个文件的句柄,NtQuerySystemInformation可以枚举系统中的所有句柄,NtQueryObject取得句柄的对象名称。
我怎么在帮助里么发现netquerysysteminformation

xiaosen666m 发表于 2010-8-27 10:11:33

在國外的論壇上好像搜索到了,大家看看:$file = "d:\1.txt"
$h = FileOpen($file, 1)
$x = _FileInUse($file)
MsgBox(0, "_FileInUse() example", "File "& $file & @CRLF & "Return= " & $x & "(Error = " & @error & ")")
;FileClose($h)
;$x = _FileInUse($file)
;MsgBox(0, "_FileInUse() example", "File "& $file & @CRLF & "Return= " & $x & "(Error = " & @error & ")")
;FileDelete($file)

;===============================================================================
;
; 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
    If $hFile = -1 Then ;INVALID_HANDLE_VALUE = -1
      $aRet = DllCall("Kernel32.dll", "int", "GetLastError")
      SetError($aRet)
      Return 1
    Else
      ;close file handle
      DllCall("Kernel32.dll", "int", "CloseHandle", "hwnd", $hFile)
      Return 0
    EndIf
EndFunc

xsjtxy 发表于 2010-8-27 10:19:55

很强。收藏一下。会英文就是好啊。可以去国外文坛发掘。

lsqyx528 发表于 2010-8-27 10:57:53

回复 6# xiaosen666m


    不错,这个还是很实用的东西啊。。
页: [1]
查看完整版本: 判斷文件是否正在使用