0

ログ ファイルをコピーするスクリプトを作成しています。コピーする前に、ログ ファイルが書き込まれていないことを確認したいと考えています。

ファイルを開こうとして、このケースをチェックすることになっている関数を作成しました。別のアプリケーションでファイルが開かれている場合、関数は $oFile.Open 呼び出しでこの状態を検出すると想定されています。

メモ帳でテスト ファイルを開いてこの関数をテストし、関数を実行しましたが、問題は報告されませんでした。つまり、$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
4

1 に答える 1

2

すべてのプログラムがファイル ハンドルを保持しているわけではありません。メモ帳はファイルを開き、その内容を読み取ってから閉じます。したがって、どのプログラムがファイルを開いているかを知る方法はありませんが、コードが使用しているハンドルが使用されている場合にのみ、ファイルが開いているかどうかを知る必要はありません。

于 2013-04-11T14:26:52.620 に答える