Как проверить, используется ли файл другим процессом - Powershell - PullRequest
6 голосов
/ 22 февраля 2012

Я пытаюсь найти решение, которое проверит, используется ли файл другим процессом.Я не хочу читать содержимое файла, так как в документе размером 7 ГБ это может занять некоторое время.В настоящее время я использую функцию, упомянутую ниже, которая не является идеальной, поскольку сценарию требуется 5–10 минут для получения значения.

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 ]

6 голосов
/ 26 июня 2012

Функция, которую я использую, чтобы проверить, заблокирован ли файл:

function IsFileLocked([string]$filePath){
    Rename-Item $filePath $filePath -ErrorVariable errs -ErrorAction SilentlyContinue
    return ($errs.Count -ne 0)
}
6 голосов
/ 23 февраля 2012

Создана функция, которая решает вышеуказанную проблему:

 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
        }
    }
2 голосов
/ 22 февраля 2017
function IsFileAccessible( [String] $FullFileName )
{
  [Boolean] $IsAccessible = $false

  try
  {
    Rename-Item $FullFileName $FullFileName -ErrorVariable LockError -ErrorAction Stop
    $IsAccessible = $true
  }
  catch
  {
    $IsAccessible = $false
  }
  return $IsAccessible
}
1 голос
/ 22 февраля 2012

Проверьте этот скрипт на 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 голосов
/ 22 февраля 2012

Поскольку вы не хотите читать файл, я бы порекомендовал использовать утилиту, подобную Sysinternals Handle.exe, которая выплюнет все открытые дескрипторы процесса. Вы можете скачать Handle.exe отсюда:

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

Вы можете запустить Handle.exe без каких-либо аргументов, и он вернет все дескрипторы открытых файлов. Вы можете при необходимости проанализировать вывод или просто сопоставить вывод с полным путем к файлу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...