VB.NET проверка, открыт ли файл перед продолжением чтения / записи?
есть ли способ проверить, что файл открыт? Единственное, о чем я могу думать, это 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
любые указатели будут оценены! Спасибо!!
3 ответов
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", так как вам все равно нужно будет попробовать catch для обработки случая, когда файл не открывается. Файл open может завершиться неудачей по многим причинам, чем он просто уже открыт.
также использование функции для проверки не является гарантией успеха. "Is file in use check" может возвращать false только для файла, открытого для сбоя с уже открытой ошибкой файла, потому что во время между проверкой и попыткой открыть файл ее открыл кто-то другой.
похоже, что два предложения из этой публикация форума MSDN оба включают в себя попытку открыть файл.
первый похож на то, что вы делаете сейчас, а второй включает в себя использование функции Windows API (CreateFile) и проверку на наличие недопустимого дескриптора, означающего, что файл используется. В обоих случаях они полагаются на условие ошибки, чтобы определить, открыт ли файл или нет. Короче говоря, на мой взгляд, метод, который вы используете, является правильным, поскольку не система.ИО.Файл.Собственность IsOpen.