2012-07-02 12 views
7

Czy istnieje metoda sprawdzania, czy plik jest otwarty? Jedyne, co mogę wymyślić to Try/Catch, aby zobaczyć, czy mogę złapać wyjątek otwierania pliku, ale pomyślałem, że dostępna jest metoda zwracania wartości true/false, jeśli plik jest otwarty.VB.NET Sprawdzanie, czy plik jest otwarty przed kontynuowaniem odczytu/zapisu?

Obecnie używa się System.IO i następującego kodu w klasie o nazwie 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 

Wszelkie wskazówki będą mile widziane! Dziękuję Ci!!

+0

Radzenie sobie z File.GetLastAccessTime() może? –

+1

Nie ma bezpośredniego sposobu wykrywania pliku, który został otwarty. – coder

+1

Oto, o co prosiłem http://stackoverflow.com/questions/6706312/how-to-check-if-text-file-is-open-and-close-the-text-file i uzyskałem odpowiedź – coder

Odpowiedz

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

Świetne rozwiązanie. Dodam tylko, że musisz upewnić się, że stream.close() na wypadek, gdyby nie było wyjątku, więc program może kontynuować bez problemu. – mlerley

+0

Mówi, że marszałek nie został ogłoszony. –

+2

@CaryBondoc 'Imports System.Runtime.InteropServices;' do naprawienia * Marszałek nie jest zgłaszany * problem. ** Wskazówka: ** 'Marshal' będzie miał niebieskie małe podkreślenie, najedź myszką na to i da ci wskazówkę, co jest nie tak! –

1

Wygląda na to, że obie sugestie z tego MSDN forum posting obejmują próbę otwarcia pliku.

Pierwsza jest podobna do tej, którą teraz robisz, a druga obejmuje użycie funkcji API systemu Windows (CreateFile) i sprawdzenie nieprawidłowego uchwytu oznaczającego, że plik jest w użyciu. W obu przypadkach polegają one na wariancie błędu, aby ustalić, czy plik jest otwarty, czy nie. W skrócie, moim zdaniem metoda, której używasz jest poprawna, ponieważ istnieje nie właściwość System.IO.File.IsOpen.

+1

Witam Mark, jestem pewien, że zdajesz sobie sprawę, że jest to zwyczajowe w odpowiedziach StackOverflow, aby dołączyć podsumowanie zawartości linku lub podświetleń, które w konkretny sposób odpowiadają na pytanie. Celem serwisów SE jest stać się zasobem wiedzy, odpowiedzi na lata. W przypadku odpowiedzi typu "link only" operator musi przekopać się przez inny zasób, aby znaleźć odpowiedź, na którą nie ma pewności. Co najważniejsze, jeśli Twój link kiedykolwiek się zepsuł, twoja odpowiedź jest bezużyteczna dla każdego, kto odwiedza tę stronę w przyszłości. Pozdrawiam za link! –

+1

@JeremyThompson Zdaję sobie z tego sprawę i robię to. W tym przypadku podjąłem decyzję ** świadomą **, aby nie wklejać żadnego kodu. Nie próbowałem sugerować, że to była właściwa droga. Próbowałem ** uspokoić ** OP, że sposób, w jaki to robił był poprawny, IMHO. Sugerowanie, że używa WinApi, nie było tym, co próbowałem zrobić, aw tym przypadku przesadą. –

+1

Dziękuję Mark, doceniam twoją odpowiedź i zgadzam się, że to przesada, ale dało mi to dobry pogląd na ten temat! Jeszcze raz dziękuję :) – Dayan

5

Jest to naprawdę nie ma sensu przy pomocy „plik jest używany Sprawdź” funkcji, ponieważ będzie trzeba jeszcze mieć try catch obsłużyć sprawę, że plik nie otwiera się. Otwarty plik może zawieść z wielu innych powodów, niż tylko jest już otwarty.

Również użycie funkcji sprawdzania nie gwarantuje sukcesu. "Sprawdzanie pliku w użyciu" może zwrócić wartość false tylko dla pliku otwartego na niepowodzenie z błędem już otwartego pliku, ponieważ w czasie między sprawdzaniem i próbą otwarcia pliku został otwarty przez kogoś innego.

+1

powinno naprawdę być komentarzem zamiast odpowiedzią – TruthOf42

Powiązane problemy