title: Unable to read an open file with binary reader
body: <p>I have this function to read the SQL Server errorlog but the problem is that I'm not able to read the errorlog that the server is using at the time. I have been google-ing and it seems that the Fileshare flag isn't working for powershell. Is there some way to set the the Fileshare flag when I try to open the file?</p>
  
  <pre>
      function check_logs{
          param($logs)
          $pos
          foreach($log in $logpos){
              if($log.host -eq $logs.host){
                  $currentLog = $log
                  break
              }
          }
          if($currentLog -eq $null){
              $currentLog = @{}
              $logpos.Add($currentLog)
              $currentLog.host = $logs.host
              $currentLog.event = $logs.type
              $currentLog.lastpos = 0
          }
          $path = $logs.file
          if($currentLog.lastpos -ne $null){$pos = $currentLog.lastpos}
          else{$pos = 0}
          if($logs.enc -eq $null){$br = New-Object System.IO.BinaryReader([System.IO.File]::Open($path, [System.IO.FileMode]::Open))}
          else{
              $encoding = $logs.enc.toUpper().Replace('-','')
              if($encoding -eq 'UTF16'){$encoding = 'Unicode'}
              $br = New-Object System.IO.BinaryReader([System.IO.File]::Open($path, [System.IO.FileMode]::Open), [System.Text.Encoding]::$encoding)
          }
          $required = $br.BaseStream.Length - $pos
          if($required -lt 0){
              $pos = 0
              $required = $br.BaseStream.Length
          }
          if($required -eq 0){$br.close(); return $null}
          $br.BaseStream.Seek($pos, [System.IO.SeekOrigin]::Begin)|Out-Null
          $bytes = $br.ReadBytes($required)
          $result = [System.Text.Encoding]::Unicode.GetString($bytes)
          $split = $result.Split("`n")
          foreach($s in $split)
           {
              if($s.contains("  Error:"))
              {
                  $errorLine = [regex]::Split($s, "\s\s+")
                  $err = [regex]::Split($errorLine[1], "\s+")
                  if(log_filter $currentLog.event $err[1..$err.length]){$Script:events = $events+ [string]$s + "`n" }         
              }
          }
          $currentLog.lastpos = $br.BaseStream.Position 
          $br.close()
       }</pre>
  
  <p>To be clear the error comes when I try to open the file. The error message is:</p>
  
  <pre><code> Exception calling "Open" with "2" argument(s): "The process cannot access the file
   'C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Log\ERRORLOG' 
    because it is being used by another process."
  </code></pre>
  
  <p>Gísli</p>