2016-07-22 4 views
1

SQLiteConnection.Open löst keine Ausnahme aus, wenn eine Datei geöffnet wird, die keine Datenbank ist.Wie überprüfe ich, ob eine Datei eine SQLite-Datenbank in C# ist?

private void openDatabase() 
{ 
    sqlite = new SQLiteConnection("Data Source=" + this.filePath + ";Version=3;"); 

    try 
    { 
     sqlite.Open(); 
    } 
    catch(SQLiteException e) 
    { 
     MessageBox.Show(e.Message + e.StackTrace); 
    } 
} 

Wie kann ich feststellen, ob eine Datei eine SQLite-Datenbank ist?

Antwort

4

die ersten 16 Bytes lesen und prüfen Sie nach der Zeichenfolge "SQLite Format"

VB.Net

Dim bytes(16) As Byte 
    Using fs As New IO.FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite) 
     fs.Read(bytes, 0, 16) 
    End Using 
    Dim chkStr As String = System.Text.ASCIIEncoding.ASCII.GetString(bytes) 
    Return chkStr.Contains("SQLite format") 

Update 2

C#

byte[] bytes = new byte[17]; 
    using (IO.FileStream fs = new IO.FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { 
    fs.Read(bytes, 0, 16); 
    } 
    string chkStr = System.Text.ASCIIEncoding.ASCII.GetString(bytes); 
    return chkStr.Contains("SQLite format"); 
+1

@Ben Sie können den Dateipfad im obigen Code übergeben und die zurückgegebene Zeichenfolge überprüfen, wenn diese das SQLite-Format enthält, dann ist Ihre Datei eine SQLite-Datenbank. Bitte überprüfen Sie, ob dies für Sie funktioniert. – Maverick

+0

Warum erstellen Sie ein Array, das 17 Bytes enthält? – Ben

+1

@Ben ist dies, weil in VB die Größe eines Arrays mit der Obergrenze des Arrays deklariert ist, wobei die meisten Sprachen (einschließlich C#) die Größe eines Arrays durch Angabe der Anzahl der Elemente im Array deklarieren. – Maverick

0
public static bool isSQLiteDatabase(string pathToFile) 
    { 
     bool result = false; 

     if (File.Exists(pathToFile)) { 

      using (FileStream stream = new FileStream(pathToFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
      { 
       byte[] header = new byte[16]; 

       for (int i = 0; i < 16; i++) 
       { 
        header[i] = (byte)stream.ReadByte(); 
       } 

       result = System.Text.Encoding.UTF8.GetString(header).Contains("SQLite format 3"); 

       stream.Close(); 
      } 

     } 

     return result; 
    } 
Verwandte Themen