2016-07-22 1 views
1

데이터베이스가 아닌 파일을 열 때 SQLiteConnection.Open이 예외를 throw하지 않습니다.C#에서 파일이 SQLite 데이터베이스인지 어떻게 확인합니까?

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

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

파일이 SQLite 데이터베이스인지 어떻게 결정합니까?

답변

4

"SQLite는 형식"

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") 

업데이트 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 위의 코드에서 파일 경로를 전달하고 반환 된 문자열을 검사 할 수 있습니다. "SQLite 형식"이 포함되어 있으면 파일이 SQLite 데이터베이스입니다. 이 방법이 효과가 있는지 확인하십시오. – Maverick

+0

17 바이트를 보유하는 배열을 만드는 이유는 무엇입니까? – Ben

+1

@Ben 이것은 VB에서 배열의 크기가 배열의 상한으로 선언되기 때문에 대부분의 언어 (C# 포함)에서 배열의 요소 수를 지정하여 배열의 크기를 선언하기 때문입니다. – 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; 
    } 
를 처음 16 바이트를 읽은 후 문자열을 확인
관련 문제