2012-02-22 135 views
5

我正在試圖找到一個解決方案來檢查另一個進程是否正在使用某個文件。我不想讀取文件的內容,例如在7GB文件上,這可能需要一段時間。目前我正在使用下面提到的功能,這並不理想,因爲腳本需要大約5-10分鐘來檢索值。如何檢查文件是否被另一個進程使用 - Powershell

function checkFileStatus($filePath) 
{ 
    write-host (getDateTime) "[ACTION][FILECHECK] Checking if" $filePath "is locked" 

    if(Get-Content $filePath | select -First 1) 
    { 
     write-host (getDateTime) "[ACTION][FILEAVAILABLE]" $filePath 
     return $true 
    } 
    else 
    { 
     write-host (getDateTime) "[ACTION][FILELOCKED] $filePath is locked" 
     return $false 
    } 
} 

任何幫助,將不勝感激

回答

5

創建瞭解決上述問題的功能:

function checkFileStatus($filePath) 
    { 
     write-host (getDateTime) "[ACTION][FILECHECK] Checking if" $filePath "is locked" 
     $fileInfo = New-Object System.IO.FileInfo $filePath 

     try 
     { 
      $fileStream = $fileInfo.Open([System.IO.FileMode]::Open, [System.IO.FileAccess]::Read, [System.IO.FileShare]::Read) 
      write-host (getDateTime) "[ACTION][FILEAVAILABLE]" $filePath 
      return $true 
     } 
     catch 
     { 
      write-host (getDateTime) "[ACTION][FILELOCKED] $filePath is locked" 
      return $false 
     } 
    } 
+0

非常感謝您的代碼。這非常有用。我正在使用它來測試共享網絡位置上的文件是否可用。每隔幾天他們就會向該位置上傳一個新的大文件(上傳需要幾個小時),並且我想確保上傳完成,以便我可以安全地將該文件複製並下載到本地計算機。你看到我的概念有什麼缺陷嗎? – FrozenLand 2013-10-16 18:00:26

+0

是否有一個原因在退出之前不會調用'$ fileStream.Dispose()'? – user2426679 2016-01-25 14:40:43

+0

@ user2426679我讀過垃圾收集器會照顧它,除非你在特定時間範圍內創建太多對象 – 2017-06-21 07:39:11

1

檢查這個腳本在poschcode.org

filter Test-FileLock { 
    if ($args[0]) {$filepath = gi $(Resolve-Path $args[0]) -Force} else {$filepath = gi $_.fullname -Force} 
    if ($filepath.psiscontainer) {return} 
    $locked = $false 
    trap { 
     Set-Variable -name locked -value $true -scope 1 
     continue 
    } 
    $inputStream = New-Object system.IO.StreamReader $filepath 
    if ($inputStream) {$inputStream.Close()} 
    @{$filepath = $locked} 
} 
+0

僅供參考,這不是一個PoshCode鏈接。 – 2012-02-22 15:51:58

+0

固定,錯誤的粘貼網址 – 2012-02-22 16:41:16

+0

謝謝,在鏈接的幫助下,我創建了一個新的功能來完成所需的功能。 – user983965 2012-02-22 18:43:45

0

,因爲你不想讀文件,我會建議使用像的Sysinternals實用程序處理.exe,它將爲進程吐出所有打開的句柄。你可以從這裏下載Handle.exe:

http://technet.microsoft.com/en-us/sysinternals/bb896655

你可以不帶任何參數運行Handle.exe,它將返回所有打開的文件句柄。您可以根據需要解析輸出,或者僅將輸出與完整文件路徑進行匹配。

3

我用它來檢查文件是否被鎖定或沒有該功能:

 
function IsFileLocked([string]$filePath){ 
    Rename-Item $filePath $filePath -ErrorVariable errs -ErrorAction SilentlyContinue 
    return ($errs.Count -ne 0) 
} 
-1
function IsFileAccessible([String] $FullFileName) 
{ 
    [Boolean] $IsAccessible = $false 

    try 
    { 
    Rename-Item $FullFileName $FullFileName -ErrorVariable LockError -ErrorAction Stop 
    $IsAccessible = $true 
    } 
    catch 
    { 
    $IsAccessible = $false 
    } 
    return $IsAccessible 
} 
+0

在你的答案中添加一些評論。 – HDJEMAI 2017-02-21 23:37:11

相關問題