2016-03-31 12 views
0

In vb.net habe ich mein Programm sqlite3.exe ausführen. Sqlite3 führt die folgenden Befehle, die in einer Textdatei gespeichert werden:Woher weiß ich, dass der von SQLite erstellte CSV geschlossen ist, damit ich ihn lesen kann?

.open prod.db 
.mode csv 
.output output.csv 
SELECT STATEMENT 
.output stdout 
.exit 

Sobald output.csv erstellt wurde, habe ich dann einen Stream laufen, um zu sehen, was die Ergebnisse waren und ich erhalte die folgende Fehlermeldung:

The process cannot access the file 'output.csv' because it is being used by another process. 

Allerdings weiß ich, dass es nicht lange gesperrt ist, weil ich zum csv gehen und es manuell öffnen kann, nachdem es erstellt wurde.

Ich würde Code schreiben zu überprüfen, um zu sehen, wenn der Prozess abgeschlossen ist, aber ich bin mir nicht sicher, welcher Prozess ausgeführt wird, um dies zu überprüfen (ich bereits nach SQLite3.exe zu schließen). Mit anderen Worten, woher weiß ich, dass mein CSV für das Öffnen von Streamreader frei ist?

+0

Gibt es eine Möglichkeit, einen Code am Ende, Zeilennummer der Zeilen, so dass Ihre co müsste auf das Ergebnis warten? (kein Fan von oder vertraut mit SQLite) – Plutonix

+1

Check [this] (http://stackoverflow.com/a/5380257/6141544) Antwort von Manuel Alves. – droque

+0

Perfekt! Ich war in der Lage, dies zu verwenden und überprüfen Sie die CSV statt den Prozess (die, ich schäme mich zu zugeben, ich dachte nicht zu tun ...!). – Dustin

Antwort

0

Mit droque des Links“

VB.Net 3.5 Check if file is in use

ich in der Lage war, dies mit einigen meiner eigenen Code zu kombinieren, um das Problem zu beheben:

While FileInUse("output.csv") And j < 100 
     System.Threading.Thread.Sleep(100) 
      j += 1 
End While 
'Timeout after ~10 seconds 
If j = 100 Then 
     MessageBox.Show("CSV timeout. Exiting now.") 
     Exit Sub 
End If 

wo FileInUse hier definiert ist:

Public Function FileInUse(ByVal sFile As String) As Boolean 
     Dim thisFileInUse As Boolean = False 
     If System.IO.File.Exists(sFile) Then 
      Try 
       Using f As New IO.FileStream(sFile, FileMode.Open, FileAccess.ReadWrite, FileShare.None) 
        ' thisFileInUse = False 
       End Using 
      Catch 
       thisFileInUse = True 
      End Try 
     End If 
     Return thisFileInUse 
    End Function 
Verwandte Themen