2013-04-11 166 views
0

我正在编写一个复制日志文件的脚本,我想确保日志文件在复制之前没有被写入。PowerShell 1 - 检查一个文件是否已被使用

我创建了一个应该通过尝试打开文件来检查这种情况的函数。假设是,如果另一个应用程序打开文件,该函数将在$ oFile.Open调用中检测到这种情况。

我通过在记事本中打开测试文件来测试此功能,然后运行该功能并且它没有报告任何问题。换句话说,即使文件已经在NotePad中打开,$ oFile.Open也会返回true。

有人能帮我理解这里发生了什么吗?

感谢

function isFileLocked([string]$Path) { 

$oFile = New-Object System.IO.FileInfo $Path 
### Make sure the path is good 
if ((Test-Path -Path $Path) -eq $false) 
{ 
    echo "Bad Path" 
    return $false 
} 
     #Try opening file 
    $oStream = $oFile.Open([System.IO.FileMode]::Open, [System.IO.FileAccess]::ReadWrite, [System.IO.FileShare]::None) 
    if ($oStream) 
    { 
    echo "Got valid stream so file must not be locked" 
    $oStream.Close() 

    return $false 

    } else { 
    echo "InValid stream so file is locked" 
    return $true 

    } 
} 


    $file="C:\Users\Tom\Daily_Reviews_0001-1191.journal" 
    $result = isFileLocked($file) 
    echo $result 

回答

2

不是所有的程序持有到文件句柄。记事本打开文件,读取其内容,然后关闭它。因此无法知道哪些程序可能会打开某个文件,但这也意味着您不需要知道某个文件是否处于打开状态,只有当您的代码使用了句柄时才需要。