2009-03-11 19 views
0

(VB.NET、.NET 3.5)奇妙な "IOExceptionが処理されませんでした"

私は次の関数を書いてtxtファイルからテキストを読みました。それはうまくいきましたが、今はそうではありません。それは「にIOExceptionが未処理だった」私は、このエラーメッセージ

を与え、

続ける「『F:\ kh_matt \ ch1.txt』プロセスはファイルにアクセスできません。それは別のプロセスによって使用されているため」

ch1.txtは、どのプログラムでも開いていたり、全く使用されていません。私はch1.txtを別の場所(ドライブD)に移動しようとしましたが、同じメッセージエラーが発生しましたが、別の場所でのみ使用されているため、プロセスはファイル 'D:\ ch1.txt'にアクセスできません。

プライベートサブbtnRead_Click(System.ObjectのとしてByVal送信者、System.EventArgsとしてByVal e)はbtnRead.Click

ハンドル
Dim reader As StreamReader 
    Dim filelocation As String 

    filelocation = "F:\kh_matt\ch1.txt" 
    Dim chid As Integer 

    chid = 1 


    If System.IO.File.Exists(filelocation) = True Then 
     reader = New StreamReader(New FileStream(filelocation, FileMode.Open)) 
    Else 
     MsgBox(filelocation, MsgBoxStyle.OkOnly) 
    End If 

    Dim MyStream As New StreamReader(Path.Combine(Application.StartupPath, filelocation)) 
    Dim vArray() As String = MyStream.ReadToEnd.Split(CChar("$")) 
    MyStream.Close() 


    Dim count As Integer 

    For d As Integer = 0 To vArray.Length - 1 Step 1 

     If d = vArray.Length - 1 Then 
      Exit For 
     End If 

     InsertKh(chid, d + 1, vArray(d)) 
     count = d + 1 
    Next 


    MsgBox("Done Inserting") 
End Sub 

それは、常にこのコードを指す:「

は、ここに私のコードブロックです:

dim M新しいStreamReaderとしてのyStream(Path.Combine(Application.StartupPath、filelocation))

ここで、それぞれのボタンをデバッグして押します。誰が問題が何であるかを指摘できますか?ありがとう

答えて

1

あなたのエラーを引き起こしているものはおそらくである、あなたは二回、ファイルを開くようです:

reader = New StreamReader(New FileStream(filelocation, FileMode.Open)) 
... 
Dim MyStream As New StreamReader(Path.Combine(Application.StartupPath, filelocation)) 

あなたはそれはあなたがするつもり何か? MyStreamを削除し、代わりにreaderを使用するようです。また、filelocationは相対的ではないため、Path.Combineを使用する必要はありません。

+0

そうです。今私は、このコードブロックをコメントアウト: 'System.IO.File.Exists(のFileLocationは)= TRUEなら、 ' リーダー=新しいStreamReaderを(新しいFileStreamを(のFileLocation、FileMode.Open)) 'エルス ' のMsgBox(のFileLocation 、MsgBoxStyle.OkOnly) 'End If –

0

例外がスローされている場合でも、ファイルを読み終えたらストリーム&ストリームリーダーを閉じてください。

try/finallyブロックを使用して、finallyブロックでstream/streamreaderを閉じます。

2

私はこれがあなたの問題だと思う:

If System.IO.File.Exists(filelocation) = True Then 
    reader = New StreamReader(New FileStream(filelocation, FileMode.Open)) 

ファイルに次の行を引き起こし、それがファイルをロックします同じファイル、上の別のStreamReaderを試してみて開き、それにStreamReaderを開きます存在する場合:

Dim MyStream As New StreamReader(Path.Combine(Application.StartupPath, filelocation)) 

が失敗する。

はまた、いくつかのポインタ:

  • はSystem.IO.Fileを使用することを検討してください。ReadAllText()メソッドの代わりに、はるかに簡単
  • あなた必見利用の流れは、例えば、彼らは正しく解放されていることを確認するために使用したブロックでそれらをラップする場合:

`

Dim vArray() As String 

using (Dim MyStream As New StreamReader(Path.Combine(Application.StartupPath, filelocation)) 
{ 
    vArray = MyStream.ReadToEnd.Split(CChar("$")) 
} 

(上記のコードが100%正しくない場合は申し訳ありませんが、VB.Netはあまり書いていません)

+0

'ReadAllText'の呼び出しがうまくいっています。そのことを知らなかった。 – Kobi

+0

@Ian Kemp。ありがとう! :D –

+0

+1用 –

0

ありがとうございます。それは私の間違いです。以前のテストで書いたコードをコメントするのを忘れてしまった。このコードをコメントアウトすると、前と同じように動作します。

'If System.IO.File.Exists(filelocation) = True Then 
    ' reader = New StreamReader(New FileStream(filelocation, FileMode.Open)) 
    'Else 
    ' MsgBox(filelocation, MsgBoxStyle.OkOnly) 
    'End If 

よい一日を。

関連する問題