如何检查另一个进程是否正在使用该文件 - Powershell

时间:2012-02-22 12:21:49

标签: .net file powershell

我正在尝试找到一个解决方案,它将检查另一个进程是否正在使用该文件。我不想读取文件的内容,就像7GB文档一样,这可能需要一段时间。目前我正在使用下面提到的功能,这是不理想的,因为脚本需要大约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 个答案:

答案 0 :(得分:6)

创建了一个解决上述问题的函数:

 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
        }
    }

答案 1 :(得分:6)

我用来检查文件是否被锁定的功能:

function IsFileLocked([string]$filePath){
    Rename-Item $filePath $filePath -ErrorVariable errs -ErrorAction SilentlyContinue
    return ($errs.Count -ne 0)
}

答案 2 :(得分: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}
}

答案 3 :(得分:0)

如果您不想阅读该文件,我建议使用像Sysinternals Handle.exe这样的实用程序,它会为进程吐出所有打开的句柄。您可以从这里下载Handle.exe:

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

您可以在不带任何参数的情况下运行Handle.exe,它将返回所有打开的文件句柄。您可以根据需要解析输出,或者只是将输出与完整文件路径匹配。

答案 4 :(得分:0)

function IsFileAccessible( [String] $FullFileName )
{
  [Boolean] $IsAccessible = $false

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