0

私は、fogbugz のレポートで、「ファイルが別のプロセスで使用されているため、ファイルにアクセスできません」というエラーが多数あることに気付きました。これは、ファイルを開いた後に閉じていないことに関係している可能性があると推測しています。または、保存後に閉じられません。これが私の問題であるかどうかを確認し、より良い方法をアドバイスしてもらえますか。

フォームのロード時にこのファイルが開かれ、閉じるときにファイルが保存されます。

フォームロード

   If IO.File.Exists(myCoolFile) Then '// check if file exists.
            Dim myCoolFileLines() As String = IO.File.ReadAllLines(myCoolFile) '// load your file as a string array.
            For Each line As String In myCoolFileLines '// loop thru array list.
                Dim lineArray() As String = line.Split("#") '// separate by "#" character.
                'Dim newItem As New ListViewItem(lineArray(0)) '// add text Item.
                ' ListView1.Items.Add(newItem) '// add Item to ListView.
                ListView1.Items.Add(lineArray(0)).Tag = (lineArray(1))
            Next

        Else
            If Not File.Exists(myCoolFile) Then
                File.Create(myCoolFile)
                End If

フォームを閉じる

     Dim myWriter As New IO.StreamWriter(myCoolFile)
        For Each myItem As ListViewItem In ListView1.Items
            myWriter.WriteLine(myItem.Text & "#" & myItem.Tag) '// write Item and SubItem.
        Next
        myWriter.Close()
4

1 に答える 1

0

より良い解決策は、データベースを使用することです。

ファイルが別のプロセスによって開かれているかどうかを確認するコードを次に示します (おそらく、少し待ってから、1 回か 2 回保存を再試行できます)。

Private Sub IsFileOpen(ByVal file As FileInfo)
    Dim stream As FileStream = Nothing
    Try
        stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None)
    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 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
于 2012-11-27T05:48:56.113 に答える