ファイルが開いていることを確認する方法はありますか?私が考えることができる唯一のことは、ファイルを開く例外をキャッチできるかどうかを確認するためのTry/Catch
ですが、ファイルが開いている場合にtrue/falseを返すメソッドを使用できると考えました。
現在、System.IO
とWallet
という名前のクラスで次のコードを使用しています。
Private holdPath As String = "defaultLog.txt"
Private _file As New FileStream(holdPath, FileMode.OpenOrCreate, FileAccess.ReadWrite)
Private file As New StreamWriter(_file)
Public Function Check(ByVal CheckNumber As Integer, ByVal CheckAmount As Decimal) As Decimal
Try
file.WriteLine("testing")
file.Close()
Catch e As IOException
'Note sure if this is the proper way.
End Try
Return 0D
End Function
どんなポインタでも大歓迎です!ありがとうございました!!
Private Sub IsFileOpen(ByVal file As FileInfo)
Dim stream As FileStream = Nothing
Try
stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None)
stream.Close()
Catch ex As Exception
If TypeOf ex Is IOException AndAlso IsFileLocked(ex) Then
' do something here, either close the file if you have a handle, show a msgbox, retry or as a last resort terminate the process - which could cause corruption and lose data
End If
End Try
End Sub
Private Shared Function IsFileLocked(exception As Exception) As Boolean
Dim errorCode As Integer = Marshal.GetHRForException(exception) And ((1 << 16) - 1)
Return errorCode = 32 OrElse errorCode = 33
End Function
'is file in use check'関数を使用しても、ファイルを開くことができない場合を処理するには、trycatchが必要になるため実際には意味がありません。ファイルを開くと、すでに開いているだけでなく、さまざまな理由で失敗する可能性があります。
また、関数を使用してチェックを行うことは、成功を保証するものではありません。 'is file in use check'は、ファイルを開いたときにfalseが返される場合があります。これは、チェックしてからファイルを開こうとするまでの間に、他の誰かによって開かれたためです。
これからの2つの提案のように見えます MSDNフォーラムの投稿 どちらもファイルを開こうとすることを含みます。
1つ目は現在行っていることと似ており、2つ目はWindows API関数(CreateFile)を使用して、ファイルが使用中であることを示す無効なハンドルをチェックすることを含みます。どちらの場合も、ファイルが開いているかどうかを判断するためにエラー条件に依存しています。要するに、私の意見では、System.IO.File.IsOpenプロパティがnotあるので、使用している方法は正しいと思います。