我有許多不同的程序創建的數據文件。有沒有辦法確定用於創建數據文件的數據庫和版本。我怎麼能告訴什麼數據庫格式的文件(或文件集)創建(德爾福)?
例如,我想確定哪些文件是從Microsoft Access,dBASE,FileMaker,FoxPro,SQLite或其他創建的。
我真的只是想以某種方式快速掃描文件,並顯示有關它們的信息,包括源數據庫和版本。
僅供參考,我使用德爾福2009年
我有許多不同的程序創建的數據文件。有沒有辦法確定用於創建數據文件的數據庫和版本。我怎麼能告訴什麼數據庫格式的文件(或文件集)創建(德爾福)?
例如,我想確定哪些文件是從Microsoft Access,dBASE,FileMaker,FoxPro,SQLite或其他創建的。
我真的只是想以某種方式快速掃描文件,並顯示有關它們的信息,包括源數據庫和版本。
僅供參考,我使用德爾福2009年
首先,檢查文件擴展名。看看corresponding wikipedia article或其他網站。
然後你可以從它所謂的「簽名」中猜出文件格式。
這主要是第一個字符的內容,它能夠識別文件格式。
您已在此very nice Gary Kessler's網站更新列表。
舉例來說,這裏是how our framework identify the MIME format from the file content,在服務器端:
function GetMimeContentType(Content: Pointer; Len: integer;
const FileName: TFileName=''): RawUTF8;
begin // see http://www.garykessler.net/library/file_sigs.html for magic numbers
result := '';
if (Content<>nil) and (Len>4) then
case PCardinal(Content)^ of
$04034B50: Result := 'application/zip'; // 50 4B 03 04
$46445025: Result := 'application/pdf'; // 25 50 44 46 2D 31 2E
$21726152: Result := 'application/x-rar-compressed'; // 52 61 72 21 1A 07 00
$AFBC7A37: Result := 'application/x-7z-compressed'; // 37 7A BC AF 27 1C
$75B22630: Result := 'audio/x-ms-wma'; // 30 26 B2 75 8E 66
$9AC6CDD7: Result := 'video/x-ms-wmv'; // D7 CD C6 9A 00 00
$474E5089: Result := 'image/png'; // 89 50 4E 47 0D 0A 1A 0A
$38464947: Result := 'image/gif'; // 47 49 46 38
$002A4949, $2A004D4D, $2B004D4D:
Result := 'image/tiff'; // 49 49 2A 00 or 4D 4D 00 2A or 4D 4D 00 2B
$E011CFD0: // Microsoft Office applications D0 CF 11 E0 = DOCFILE
if Len>600 then
case PWordArray(Content)^[256] of // at offset 512
$A5EC: Result := 'application/msword'; // EC A5 C1 00
$FFFD: // FD FF FF
case PByteArray(Content)^[516] of
$0E,$1C,$43: Result := 'application/vnd.ms-powerpoint';
$10,$1F,$20,$22,$23,$28,$29: Result := 'application/vnd.ms-excel';
end;
end;
else
case PCardinal(Content)^ and $00ffffff of
$685A42: Result := 'application/bzip2'; // 42 5A 68
$088B1F: Result := 'application/gzip'; // 1F 8B 08
$492049: Result := 'image/tiff'; // 49 20 49
$FFD8FF: Result := 'image/jpeg'; // FF D8 FF DB/E0/E1/E2/E3/E8
else
case PWord(Content)^ of
$4D42: Result := 'image/bmp'; // 42 4D
end;
end;
end;
if (Result='') and (FileName<>'') then begin
case GetFileNameExtIndex(FileName,'png,gif,tiff,tif,jpg,jpeg,bmp,doc,docx') of
0: Result := 'image/png';
1: Result := 'image/gif';
2,3: Result := 'image/tiff';
4,5: Result := 'image/jpeg';
6: Result := 'image/bmp';
7,8: Result := 'application/msword';
else begin
Result := RawUTF8(ExtractFileExt(FileName));
if Result<>'' then begin
Result[1] := '/';
Result := 'application'+LowerCase(Result);
end;
end;
end;
end;
if Result='' then
Result := 'application/octet-stream';
end;
您可以使用類似的功能,從加里·凱斯勒的列表。
完美!這正是我想知道的。而加里凱斯勒的頁面(無關)是一個很好的參考。 – lkessler 2011-06-04 19:57:54
什麼姓氏... :) – 2011-06-06 14:41:29
有很多的數據庫引擎與版本和格式的數百名(如果不是數千名)。 (二進制,CSV,XML ...)其中許多都是加密的以保護內容。識別每個數據庫和每種格式都是「不可能的」,並且它是一個不斷變化的主題。
因此,首先你必須將你的任務限制在你想要掃描的數據庫引擎列表中。那就是我會做的...
好的。如果我從我給的清單開始,那麼如何?識別它們的最好方法是什麼?如果還有其他常用的並且容易識別的,那麼我可以添加它們。也許有一個德爾福組件已經在這個地方? – lkessler 2011-06-04 16:57:20
我嚴重懷疑有一個工具可以識別「任何數據庫文件」。沒有可以使用的共同特徵,您必須將所有可能的數據庫訪問庫合併到一個超大型庫中。當文件屬於特定類型但損壞時,您建議您的工具如何處理?你的問題沒有很好的定義,或者真的,最終是可以回答的。 – 2011-06-04 17:13:40
首先,我不相信你可以做更多的「快速掃描」,而不是提供「可能的格式」。另外,很難想象任何快速技術都可靠。
DBASE文件通常使用擴展名.dbf。 FoxPro和Clipper使用dBase文件格式的變體。 Wikipedia將這些文件記錄爲xBase。任何可以打開dBase文件的dBase庫也可能能夠(a)通過打開dBase文件來證明這實際上是一個真正的dBase文件,並且(b)允許您查看xBase文件格式支持的哪些變體正在使用。
訪問文件通常使用.mdb文件格式,但可以用密碼加密。你可以編寫自己的庫,它可以明確地將內部內容標識爲「Jet數據庫引擎」(由Access使用的內部文件類型),但不讀取內容,但是我懷疑破解密碼的缺點,你可以做到這一點可靠。
FileMaker文件可以有許多文件擴展名,並且它們的內部文件格式沒有很好的記錄。根據維基百科,.fm .fp3 .fp5和.fp7是常見的文件擴展名。與Access一樣,您將在Filemaker數據庫中遇到類似的「密碼」問題。我不知道有什麼方法可以通過ODBC讀取delphi中的filemaker文件,即使如此,我認爲您不能在Delphi中提供由ODBC驅動的「omni-reader」,因爲ODBC需要仔細的設置和知識將原始文件轉換爲odbc數據源,然後通過ODBC讀取。瀏覽/發現不是ODBC支持的階段。
SQLite文件可以有任何文件擴展名。嘗試檢測它的最簡單方法是使用SQLite加載/打開文件並查看它是否打開。
列表的其餘部分或多或少是無限的,技術也是一樣的。只要繼續將更多數據庫引擎和訪問層庫存入您的Katamari Damaci數據庫檢測器工具。
如果你想從舊的數據庫格式開始,我會用BDE(古代的,但嘿,你在談論古代的東西)和ADO來嘗試自動檢測和打開文件。
當然你知道文件擴展名。其次,你應該知道,也許很多程序根本不使用數據庫文件格式,而且世界上的私有二進制文件格式的數量是所有意圖和目的都是不可數的。 – 2011-06-04 17:04:56
@Warren:我特別關注家譜軟件。他們傾向於在他們的程序中使用數據庫驅動程序,但將他們的數據作爲具有專有擴展的項目文件保存到磁盤。例如,我將使用DISQLite3,並將以SQLite格式保存我的.bhp文件。 – lkessler 2011-06-04 19:48:32
但我想,這個「重命名」的數據庫文件往往不是他們的「本地」格式。我認爲他們經常被封裝成一個更大的結構(「容器」)和其他一些(非數據庫)信息,也許是壓縮。至少我是用我的項目來做的。 – Andreas 2011-06-04 22:45:27