LAN上のリモートPC上のWindowsアップデートログを読み込もうとしています。ほとんどの場合、ファイルを正常に読み取ることができますが、プログラムがロックされることがあります。 1つの問題または別の問題の可能性があります - 本当に重要ではありません。私が必要とするのは、Filestream/Streamreaderがロックアップしたときに回復する方法です。ロックを引き起こしているかどうかわかりません。いくつかのストリームはタイムアウトを設定できますが、以下のfilestreamは.CanTimeout呼び出しでFalseを返します。Filestream読み取り専用ロックPC
ストリームがロックアップした場合はどうすれば解除できますか? (時にはロックが強すぎるため、電源を切って復旧する必要があります)
実際に読み込みを試みる前にストリームが失敗するかどうかテストする方法はありますか?
別のプログラムが開いているリモートログファイルを読み取る別の方法はありますか? (ファイルがリモートPC上で開いているため、定期的なFile.IOがブロックされたので、私はストリーム方式を使用しています。)
を私はこのコードで(と思う)近づいています。私は参照されたポストからpathExistsコードをブラウズしましたが、答えではなくOPでした。
Imports System.IO
Import System.Threading
...
Function GetAULog(PCName As String) As String
Try
Dim sLogPath As String = String.Format("\\{0}\c$\Windows\SoftwareDistribution\ReportingEvents.log", PCName)
If PCName = My.Computer.Name Then
sLogPath = String.Format("C:\Windows\SoftwareDistribution\ReportingEvents.log", PCName)
End If
' read file open by another process
If Not pathExists(sLogPath) Then
MsgBox("AU log file not found - PC on?")
Return "NA"
End If
Using fs As New FileStream(sLogPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
Using sr As New StreamReader(fs)
Dim s As String = sr.ReadToEnd
Return s
End Using
End Using
Catch ex As Exception
MsgBox(ex.Message)
Return ""
End Try
End Function
Public Function pathExists(path As String) As Boolean
Dim exists As Boolean = True
Dim t As New Thread(New ThreadStart(Sub() exists = System.IO.File.Exists(path)))
t.Start()
Dim completed As Boolean = t.Join(500)
'half a sec of timeout
If Not completed Then
exists = False
t.Abort()
End If
t = Nothing
Return exists
End Function
少なくとも、PCがオフの場合、pathExists()コードは短期間でFalseを返します。
私の問題は、プログラムが終了するときにプロセスが終了しないことです。少なくともIDEでは実行時にチェックが行われませんでした。
私はt = Nothing
を追加しましたが、それは助けになりませんでした。私はそれをテストするために適切な構文を理解することができませんでした。 スレッドのタイムアウト後にどのように正しくクリーンアップできますか?
ファイルが存在する場合(存在を確認するためにコードを変更する必要があります)、合理的なサイズであるため、これはおそらく私の問題ではありません。接続時にハングアップするようです。たぶんExistsは接続の問題を暴露し、うまくタイムアウトするでしょう。 – rheitzman
私が問題を抱えたとき、それは大きなファイルか小さなファイルかは関係ありませんでした。 .netアプリを30種類のマシンにプッシュするスクリプトを使用していました。断続的に、これらのマシンのいくつかは、再起動が完了するまで、ファイル共有のロックアップを持ちます。上記の方法で修正しました。 – FloatingKiwi
私は実際にターゲットマシンにアクセスしていないので、より汎用的なソリューションが必要です。 – rheitzman