我正在尝试找到一个解决方案,它将检查另一个进程是否正在使用该文件。我不想读取文件的内容,就像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
}
}
非常感谢任何帮助
答案 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
}