2012-07-02 5 views
7

ファイルが開いていることを確認する方法はありますか?私が考えることができるのはTry/Catchですが、ファイルオープンの例外をキャッチできるかどうかを確認することができますが、ファイルが開いている場合にtrue/falseを返すメソッドがあると考えました。VB.NET Read/Writeを続行する前にファイルが開いているかどうかをチェックしますか?

現在、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 

何か指摘します!ありがとうございました!!

+0

File.GetLastAccessTime()の扱いは多分ですか? –

+1

ファイルが開かれたことを直接検出する方法はありません。 – coder

+1

これは私が尋ねたものですhttp://stackoverflow.com/questions/6706312/how-to-check-if-the-text-file-is-open-and-close-the-text-fileそして答えを得ました – coder

答えて

14
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 
+2

すばらしい解決策。例外がない場合にはstream.close()を確実にする必要があるので、プログラムは問題なく継続できます。 – mlerley

+0

マーシャルは宣言されていません。 –

+2

@CaryBondoc 'Imports System.Runtime.InteropServices;' *マーシャルが*宣言されていない問題を修正しました。 **ヒント:** 'マーシャル(Marshal) 'には、青い下線が引かれ、この上にマウスを置くと、何が間違っているかのヒントが得られます! –

1

このMSDN forum postingの2つの提案のいずれもファイルを開こうとしているようです。

最初のものはあなたが今やっているのと似ていますが、2番目はWindows API関数(CreateFile)を使用して、ファイルが使用中であることを示す無効なハンドルを確認します。いずれの場合も、ファイルが開いているかどうかを判断するためにエラー状態に頼っています。つまり、ではなく、というSystem.IO.File.IsOpenプロパティが使用されているので、使用しているメソッドは正しいと私の意見では思われます。

+1

こんにちはマーク、私はStackOverflowの回答では、リンクの内容や質問に具体的に答えるハイライトの要約を含めることが慣例であることを認識していると確信しています。 SEのサイトの目的は、知識の源泉、解答の源泉となることです。リンクオンリーの回答では、オペレータは確かではない回答を見つけるために別のリソースを調べなければなりません。最も重要なのは、あなたのリンクが絶たれた場合、あなたの答えは将来このページを訪れる人にとって役に立たないことです。リンクthoのための乾杯! –

+1

@JeremyThompson私はそれを認識しています。この場合、私は**コードを貼り付けないように**意識的な決定をしました。私はこれが適切な方法だと提案しようとしていませんでした。私は彼がそれをしていた方法が正しい、IMHOである** OPを**安心させるように努めていました。彼がWinApiを使用することを提案することは、私がやろうとしていたものではなく、この場合は過剰なものでした。 –

+1

マークありがとう、私はあなたの答えに感謝し、私はそれが残虐だと同意するが、それは私にその件に関する良い見通しを与えた!もう一度ありがとう:) – Dayan

5

は本当にあなたはまだファイルが開かないケースを処理しようとするキャッチを持っている必要がありますので、関数「使用チェックであるファイルを」を使用しない点はありません。ファイルが開いているだけでなく、さらに多くの理由でファイルが開くことがあります。

また、チェックを行う機能を使用することは、成功を保証するものではありません。ファイルが開かれているときにエラーが発生しました。これは、チェックと他の誰かによって開かれたファイルを開こうとする間の時間のためです。

+1

は本当に答えではなくコメントでなければなりません – TruthOf42

関連する問題