2

共有フォルダー MyShared があるとします。

ユーザー A は、30 秒ごとに \MyShared:\Foo.txt ファイルを取得します。

そして、\MyShared:\Foo.txt も 28 秒ごとに (PowerShell スクリプト内で) 上書きします。

PowerShell で、ユーザーがファイルを取得している間にこのファイルを上書きしないようにするにはどうすればよいですか? (ユーザーがファイルを取得するときにファイルを上書きしようとして、ファイルの内容を壊したり、何らかのエラーが発生したりしたくありません)

質問を言い換えると、別のプロセスがファイルの読み取りを完了するまで、Powershell スクリプトにファイルの上書きを強制的に待機させるにはどうすればよいですか?

4

3 に答える 3

1

場合によっては、ファイルが開いていると上書きできないことがあります。

それ以外の場合は、リーダーが読み取りを終了したことを通知するために、他のメカニズムを考案する必要があります。これは実際にはPowerShellとは関係ありません。たとえば、リーダーは「ロックファイル」を作成して、ファイルが読み取られていることをライターに通知できます。このファイルは、読み取りの完了後に削除されます。ロックファイルが存在しない場合、PowerShellスクリプトはファイルを削除できます。

于 2012-12-06T06:45:06.557 に答える
1

この関数を使用してファイルがロックされているかどうかをテストしますが、たとえばメモ帳で開いたファイルtxtでは、ファイルはロックされていません。

function Test-FileLock {

  param (
        [parameter(Mandatory=$true)]
        [string]$Path
    )

  $oFile = New-Object System.IO.FileInfo $Path    
  if ((Test-Path -Path $Path) -eq $false)
  {
    $false
    return
  }      
  try
  {
      $oStream = $oFile.Open([System.IO.FileMode]::Open, [System.IO.FileAccess]::ReadWrite, [System.IO.FileShare]::None)
      if ($oStream)
      {
        $oStream.Close()
      }
      $false
  }
  catch
  {
    # file is locked by a process.
    $true
  }
}
于 2012-12-06T06:46:34.420 に答える
0

System.IO.File クラスで静的 Open メソッドを使用できます。ファイルを開こうとして別のプロセスで使用されている場合は、例外がスローされます。それを try/catch ブロックでラップすると、例外がスローされたかどうかがわかるため、$true を返すことができます使用中を意味するブロックをキャッチします。

function Get-FileStatus([string]$Path)
{
     try
     {
        [System.IO.File]::Open($Path, [System.IO.FileMode]::Open, [System.IO.FileAccess]::ReadWrite, [System.IO.FileShare]::None)
        return $false
     }
     catch
     {
        return $true
     }
}



if((Get-FileStatus -Path "C:\myfile.bin"))
{
   Write-Host "File in Use"
}
else
{
   Write-Host "File Not in Use"
}
于 2012-12-06T07:01:34.680 に答える