filepowershelllocking

Powershell: Check if a file is locked


I have a problem with automating a deployment, after I stop the service there is still a lock on the file and I am unable to delete it. I really do not want to start hacking about with sleeps to make something that 'usually works'. Is there a good way to properly resolve the problem of locked files, perhaps some kind of 'wait until file is removable':

Get-ChildItem : Access to the path 'D:\MyDirectory\' is denied.

'Test-Path' is not sufficient in this case as the folder both exists and I have access to it.


Solution

  • With thanks to David Brabant who posted a link to this solution under the initial question. It appears I can do this by starting off with the following function:

    function Test-FileLock {
      param (
        [parameter(Mandatory=$true)][string]$Path
      )
    
      $oFile = New-Object System.IO.FileInfo $Path
    
      if ((Test-Path -Path $Path) -eq $false) {
        return $false
      }
    
      try {
        $oStream = $oFile.Open([System.IO.FileMode]::Open, [System.IO.FileAccess]::ReadWrite, [System.IO.FileShare]::None)
    
        if ($oStream) {
          $oStream.Close()
        }
        return $false
      } catch {
        # file is locked by a process.
        return $true
      }
    }
    

    Then add a 'wait until' function with a timeout.

    Thanks for your help!