程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi 文件處理(2)

Delphi 文件處理(2)

編輯:Delphi

1. 文件管理類函數

判斷文件是否存在 FileExists                              判斷文件夾是否存在 DirectoryExists

刪除文件 DeleteFile; Windows.DeleteFile          刪除文件夾 RemoveDir; RemoveDirectory

獲取當前文件夾 GetCurrentDir                          設置當前文件夾 SetCurrentDir; ChDir; SetCurrentDirectory

獲取指定驅動器的當前路徑名 GetDir                文件改名 RenameFile

建立文件夾 CreateDir; CreateDirectory; ForceDirectories                    刪除空文件夾 RemoveDir; RemoveDirectory

獲取當前文件的版本號 GetFileVersion               獲取磁盤空間 DiskSize; DiskFree

查找一個文件 FileSearch                                   搜索文件 FindFirst; FindNext; FindClose

讀取與設置文件屬性 FileGetAttr; FileSetAttr                                            獲取文件的創建時間 FileAge; FileDateToDateTime

 

1.1 API 文件處理函數

1. GetWindowsDirectory - 獲取 Windows 所在目錄

//聲明:GetWindowsDirectory(

                  lpBuffer: PChar;{緩沖區}

                  uSize: UINT     {緩沖區大小}): UINT;         {返回實際長度}

num := GetWindowsDirectory(arr, MAX_PATH);

2. GetSystemDirectory - 返回 System 文件夾路徑

//聲明:
GetSystemDirectory(
  lpBuffer: PChar; {緩沖區}
  uSize: UINT      {緩沖區大小}
): UINT;           {返回實際長度}

num := GetSystemDirectory(arr, MAX_PATH); 

3.GetTempPath - 獲取臨時文件夾路徑

//聲明:
GetTempPath(
  nBufferLength: DWORD; {緩沖區大小}
  lpBuffer: PChar       {緩沖區}
): DWORD;               {返回實際長度}
num := GetTempPath(MAX_PATH, arr)

 

4.GetTempFileName - 生成一個臨時文件名

 

5.CopyFile - 復制文件

//聲明:
CopyFile(
  lpExistingFileName: PChar; {源文件}
  lpNewFileName: PChar;      {目標文件}
  bFailIfExists: BOOL        {如果目標文件存在, True: 失敗; False: 覆蓋}
): BOOL;


6.CreateDirectory - 建立文件夾

CreateDirectory(PChar(dir), nil);

 

7.CreateDirectoryEx - 根據模版建立文件夾

CreateDirectoryEx(PChar(TDir), PChar(Dir),nil);

 

8.RemoveDirectory - 刪除空目錄//聲明:
RemoveDirectory(
  lpPathName: PAnsiChar {目錄名}
): BOOL;

if RemoveDirectory(PChar(Dir))then

 

9.SetCurrentDirectory、GetCurrentDirectory - 設置與獲取當前目錄

SetCurrentDirectory('c:\temp');

GetCurrentDirectory(SizeOf(buf), buf);

 

10.SetVolumeLabel - 設置磁盤卷標

SetVolumeLabel('c:\', 'NewLabel');

 

 

2. INI 文件讀取

[delphi] view plaincopyprint?private 
    List: TStrings; 
    Fini: TIniFile; 
    Path: string; 
    Section,Key: string; 
    { Private declarations } 
  public 
    { Public declarations } 
  end; 
 
var 
  MainForm: TMainForm; 
 
implementation 
uses 
  ShellAPI; 
 
{$R *.dfm} 
 
{
  INI File ===============================================================

procedure TMainForm.FormCreate(Sender: TObject); 
begin 
  Path := ChangeFileExt(ParamStr(0),'.ini'); 
  Fini := TIniFile.Create(Path); 
end; 
 
//寫入 Write  INI  
procedure TMainForm.Button1Click(Sender: TObject); 
begin 
  Section := 'Delphi xe Title'; 
  Key := 'Astring Key'; 
  Fini.WriteString(Section,Key,'a_string value'); 
  ShellExecute(0,'open',PAnsiChar(Path),nil,nil,sw_show); 
end; 
 
//讀取 Read INI  
procedure TMainForm.Button2Click(Sender: TObject); 
var 
  s: string; 
begin 
  s := Fini.ReadString('Delphi xe Title','Astring Key',''); 
  ShowMessage(s); 
end; 
 
//讀取 字節Read ReadSections ....Section  
procedure TMainForm.Button3Click(Sender: TObject); 
begin 
  List := TStringList.Create; 
  Fini.ReadSections(List); 
  ShowMessage(List.Text);    //Delphi xe Title  
end; 
 
//讀取關鍵字 Read  ReadSection  ...Key  
procedure TMainForm.Button4Click(Sender: TObject); 
begin 
  List := TStringList.Create; 
  Fini.ReadSection('Delphi xe Title',List); 
  ShowMessage(List.Text);  //AString Key  
end; 
 
//刪除節點DeleteKey   
 
procedure TMainForm.Button5Click(Sender: TObject); 
begin 
  Fini.DeleteKey('Delphi xe Title','AString Key'); 
end; 
 
//刪除全部  EraseSection  
procedure TMainForm.Button6Click(Sender: TObject); 
begin 
  Fini.EraseSection('Delphi xe Title'); 
end; 
 
//Other...  
procedure TMainForm.Button7Click(Sender: TObject); 
var 
  b: Boolean; 
  s: string; 
begin 
  b := Fini.SectionExists('Delphi xe Title');         {讀取 小節} 
  ShowMessage(BoolToStr(b)); 
  b := Fini.ValueExists('Delphi xe Title','AString Key'); {讀取} 
  ShowMessage(BoolToStr(b)); 
  s := Fini.FileName;                     {文件名} 
  ShowMessage(s); 
end; 

private
    List: TStrings;
    Fini: TIniFile;
    Path: string;
    Section,Key: string;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  MainForm: TMainForm;

implementation
uses
  ShellAPI;

{$R *.dfm}

{
  INI File ===============================================================
}
procedure TMainForm.FormCreate(Sender: TObject);
begin
  Path := ChangeFileExt(ParamStr(0),'.ini');
  Fini := TIniFile.Create(Path);
end;

//寫入 Write  INI
procedure TMainForm.Button1Click(Sender: TObject);
begin
  Section := 'Delphi xe Title';
  Key := 'Astring Key';
  Fini.WriteString(Section,Key,'a_string value');
  ShellExecute(0,'open',PAnsiChar(Path),nil,nil,sw_show);
end;

//讀取 Read INI
procedure TMainForm.Button2Click(Sender: TObject);
var
  s: string;
begin
  s := Fini.ReadString('Delphi xe Title','Astring Key','');
  ShowMessage(s);
end;

//讀取 字節Read ReadSections ....Section
procedure TMainForm.Button3Click(Sender: TObject);
begin
  List := TStringList.Create;
  Fini.ReadSections(List);
  ShowMessage(List.Text);    //Delphi xe Title
end;

//讀取關鍵字 Read  ReadSection  ...Key
procedure TMainForm.Button4Click(Sender: TObject);
begin
  List := TStringList.Create;
  Fini.ReadSection('Delphi xe Title',List);
  ShowMessage(List.Text);  //AString Key
end;

//刪除節點DeleteKey

procedure TMainForm.Button5Click(Sender: TObject);
begin
  Fini.DeleteKey('Delphi xe Title','AString Key');
end;

//刪除全部  EraseSection
procedure TMainForm.Button6Click(Sender: TObject);
begin
  Fini.EraseSection('Delphi xe Title');
end;

//Other...
procedure TMainForm.Button7Click(Sender: TObject);
var
  b: Boolean;
  s: string;
begin
  b := Fini.SectionExists('Delphi xe Title');         {讀取 小節}
  ShowMessage(BoolToStr(b));
  b := Fini.ValueExists('Delphi xe Title','AString Key'); {讀取}
  ShowMessage(BoolToStr(b));
  s := Fini.FileName;                     {文件名}
  ShowMessage(s);
end;

 

3.文本文件 讀寫

Delphi 支持三種文件類型: 文本文件、記錄文件、無類型文件。

文本文件是以行為單位進行讀、寫的。由於每一行的長度不一定相同,不能計算出給定行在文件中的確切位置,因而只能順序地讀寫。
文本文件只能單獨為讀或寫而打開,在一個打開的文本文件上同時進行讀、寫操作是不允許的。

文本文件的打開需要兩個步驟:1.文件變量與文件名關聯;2.初始化讀寫。

1.文件變量與文件名關聯:
AssignFile(VarTxt, FileName);
FileName 如果省略路徑將默認當前目錄。

2.初始化讀寫有三種方式:
(1) Reset: 只讀打開, 指針移到文件頭;
(2) Rewrite: 創建新文件並打開, 只寫;
(3) Append: 從尾部追加, 指針當然在文件尾。

文件不存在時使用 Reset 或 Append 會引發一個I/O異常。

最後用 CloseFile 關閉文件。

 

[delphi] view plaincopyprint? var 
    F: Text; 
    FileName: string = 'D:\Delphi Study N\15.Delphi File\a.txt'; 
 
{
  Text File ================================================

 
//寫入 Write Txt  
procedure TMainForm.Button8Click(Sender: TObject); 
begin 
  AssignFile(F,FileName); 
  Rewrite(F);  //沒有就覆蓋  
 
  writeln(F,'One'); 
  Writeln(F,'Two'); 
 
  CloseFile(F); 
   
  ShellExecute(0,'Open',PAnsiChar(FileName),nil,nil,SW_SHOW); 
end; 
 
//讀取 Read Txt  
procedure TMainForm.Button9Click(Sender: TObject); 
var 
  s: string; 
begin 
  AssignFile(F,FileName); 
  Reset(F); 
 
  Readln(F,s); 
  ShowMessage(s); 
 
  CloseFile(F); 
end; 
 
//增加 Add Txt  
procedure TMainForm.Button10Click(Sender: TObject); 
begin 
  AssignFile(F,FileName); 
  Append(F); 
 
  Writeln(F,'Three'); 
  Writeln(F,'Four'); 
 
  CloseFile(F); 
  ShellExecute(0,'Open',PAnsiChar(FileName),nil,nil,SW_SHOW); 
end; 
 
//Read All Txt  
procedure TMainForm.Button11Click(Sender: TObject); 
var 
  s: string; 
begin 
  AssignFile(F,FileName); 
  Reset(F); 
 
  while not Eof(F) do 
  begin 
    Readln(F,s); 
    Memo1.Lines.Add(s); 
  end; 
  CloseFile(F); 
end; 
 
//Write and Read Not same type 寫入和讀取不同的類型  
procedure TMainForm.Button12Click(Sender: TObject); 
var 
  name: string[6]; 
  age: Word; 
  birthday: TDate; 
begin 
  AssignFile(F,FileName); 
  Rewrite(F); 
 
  name := 'lailai ';  //????6?才  
  age := 25; 
  birthday := StrToDate(DateToStr(Now-25*365));  //安さぱ?ネら  
  Writeln(F,name,age,birthday); 
 
  CloseFile(F); 
  Reset(F); 
 
  Readln(F,name,age,birthday); 
  Memo1.Clear; 
  Memo1.Lines.Add(name); 
  Memo1.Lines.Add(IntToStr(age)); 
  Memo1.Lines.Add(DateToStr(birthday)); 
 
  CloseFile(F); 
end; 
 
  

 var
    F: Text;
    FileName: string = 'D:\Delphi Study N\15.Delphi File\a.txt';

{
  Text File ================================================
}

//寫入 Write Txt
procedure TMainForm.Button8Click(Sender: TObject);
begin
  AssignFile(F,FileName);
  Rewrite(F);  //沒有就覆蓋

  writeln(F,'One');
  Writeln(F,'Two');

  CloseFile(F);
 
  ShellExecute(0,'Open',PAnsiChar(FileName),nil,nil,SW_SHOW);
end;

//讀取 Read Txt
procedure TMainForm.Button9Click(Sender: TObject);
var
  s: string;
begin
  AssignFile(F,FileName);
  Reset(F);

  Readln(F,s);
  ShowMessage(s);

  CloseFile(F);
end;

//增加 Add Txt
procedure TMainForm.Button10Click(Sender: TObject);
begin
  AssignFile(F,FileName);
  Append(F);

  Writeln(F,'Three');
  Writeln(F,'Four');

  CloseFile(F);
  ShellExecute(0,'Open',PAnsiChar(FileName),nil,nil,SW_SHOW);
end;

//Read All Txt
procedure TMainForm.Button11Click(Sender: TObject);
var
  s: string;
begin
  AssignFile(F,FileName);
  Reset(F);

  while not Eof(F) do
  begin
    Readln(F,s);
    Memo1.Lines.Add(s);
  end;
  CloseFile(F);
end;

//Write and Read Not same type 寫入和讀取不同的類型
procedure TMainForm.Button12Click(Sender: TObject);
var
  name: string[6];
  age: Word;
  birthday: TDate;
begin
  AssignFile(F,FileName);
  Rewrite(F);

  name := 'lailai ';  //????6?才
  age := 25;
  birthday := StrToDate(DateToStr(Now-25*365));  //安さぱ?ネら
  Writeln(F,name,age,birthday);

  CloseFile(F);
  Reset(F);

  Readln(F,name,age,birthday);
  Memo1.Clear;
  Memo1.Lines.Add(name);
  Memo1.Lines.Add(IntToStr(age));
  Memo1.Lines.Add(DateToStr(birthday));

  CloseFile(F);
end;

 

4. 結構化文件存取

AssignFile: 關聯
Rewrite: 創建並打開一個新文件, 如已存在則覆蓋
Reset: 打開已存在的文件; 追加也要用它先打開, 然後再移動指針; Append 是文本文件專用的
CloseFile: 關閉

FileSize: 記錄數
FilePos: 返回文件的當前位置
Seek: 把文件指針移到指定位置(只用於結構化文件)
Eof: 文件尾

Read: 讀
Write: 寫

另外: 包含長字符串、變量、類實例、接口或動態數組的記錄不能寫入類型文件中!

 

[delphi] view plaincopyprint?type 
  TPersonrec = packed record 
    name: string[12]; 
    age: Word; 
    birthday: TDate; 
  end; //先定義一個結構  
 
  var 
    DataFile: file of TPersonRec;  //聲明 DataFile 用來讀寫 TPersonRec 結構數據   
 
    PersonRec: TPersonRec;  //聲明結構變量     
 
     FeName: string = 'D:\Delphi Study N\15.Delphi File\b.dat';  //文件名  
 
//write .dat  
procedure TMainForm.Button13Click(Sender: TObject); 
begin 
  AssignFile(DataFile,FeName); 
  Rewrite(DataFile);  //建立文件, 如果存在就覆蓋  
 
  PersonRec.name := 'lailai'; 
  PersonRec.age := 25; 
  PersonRec.birthday := StrToDate('1988/11/16'); 
 
  write(datafile,personrec); 
 
  CloseFile(DataFile); 
 
  ShellExecute(0,'Open',PAnsiChar(FeName),nil,nil,SW_SHOW); 
end; 
 
//Add dat  
procedure TMainForm.Button14Click(Sender: TObject); 
begin 
  AssignFile(DataFile,FeName); 
  Reset(DataFile);  //Append 只對文本文件  
 
  Seek(DataFile,FileSize(DataFile)); //移到文件尾, 這裡的 FileSize 表示有多少條記錄  
 
  PersonRec.name := 'ailaio'; 
  PersonRec.age := 7; 
  PersonRec.birthday := StrToDate('2006/12/19'); 
  Write(DataFile,PersonRec); 
 
  CloseFile(DataFile); 
end; 
 
//修改 Alter dat  
procedure TMainForm.Button15Click(Sender: TObject); 
begin 
  AssignFile(DataFile,FeName); 
  Reset(DataFile); 
 
  Seek(DataFile,1); //指針移到第2條  
  read(datafile,personrec); 
  PersonRec.age := 0; 
  PersonRec.birthday := StrToDate('2013/1/2'); 
 
  Seek(DataFile,3); 
  write(datafile,personrec); 
   
  CloseFile(DataFile); 
end; 
 
 
  

type
  TPersonrec = packed record
    name: string[12];
    age: Word;
    birthday: TDate;
  end; //先定義一個結構

  var
    DataFile: file of TPersonRec;  //聲明 DataFile 用來讀寫 TPersonRec 結構數據

    PersonRec: TPersonRec;  //聲明結構變量  

     FeName: string = 'D:\Delphi Study N\15.Delphi File\b.dat';  //文件名

//write .dat
procedure TMainForm.Button13Click(Sender: TObject);
begin
  AssignFile(DataFile,FeName);
  Rewrite(DataFile);  //建立文件, 如果存在就覆蓋

  PersonRec.name := 'lailai';
  PersonRec.age := 25;
  PersonRec.birthday := StrToDate('1988/11/16');

  write(datafile,personrec);

  CloseFile(DataFile);

  ShellExecute(0,'Open',PAnsiChar(FeName),nil,nil,SW_SHOW);
end;

//Add dat
procedure TMainForm.Button14Click(Sender: TObject);
begin
  AssignFile(DataFile,FeName);
  Reset(DataFile);  //Append 只對文本文件

  Seek(DataFile,FileSize(DataFile)); //移到文件尾, 這裡的 FileSize 表示有多少條記錄

  PersonRec.name := 'ailaio';
  PersonRec.age := 7;
  PersonRec.birthday := StrToDate('2006/12/19');
  Write(DataFile,PersonRec);

  CloseFile(DataFile);
end;

//修改 Alter dat
procedure TMainForm.Button15Click(Sender: TObject);
begin
  AssignFile(DataFile,FeName);
  Reset(DataFile);

  Seek(DataFile,1); //指針移到第2條
  read(datafile,personrec);
  PersonRec.age := 0;
  PersonRec.birthday := StrToDate('2013/1/2');

  Seek(DataFile,3);
  write(datafile,personrec);
 
  CloseFile(DataFile);
end;


 5. WinAPI: WritePrivateProfileString、GetPrivateProfileString - 簡單讀寫 Ini 文件

    WritePrivateProfileString('段1','Key1','值1', PChar(FilePath));

   GetPrivateProfileString('段1','Key2','默認值', buf, Length(buf), PChar(FilePath));

 

6.復雜的結構化存取

有些文檔不是結構化的, 譬如記事本文件; 結構化的檔可以分為以下幾類:
標准結構化文檔、自定義結構化文檔(譬如 bmp 文件)和復合文檔.

這裡要談到的結構化儲存(復合文檔)是由 Windows 系統通過 COM 提供的, 它能完成像 Windows 目錄結構一樣復雜的文件結構的存取; 提示一下 Windows 的目錄結構: 一個目錄下可以包含子目錄和文件, 然後層層嵌套...

有時我們要存儲的文件也可能會層層分支, 具體的文件內容也可能五花八門, 譬如分支當中的某個文件是張圖片、是一個字符串列表、是一個記錄(或叫結構)等等, 存儲這樣的文件內容恐怕用數據庫也是無能為力的.

這種復合文件支持多線程, 不同的進程中的不同線程可以同時訪問一個復合文件的不同部分.

復合文件最典型的實例就是 OLE(譬如在 Word 中可以嵌入電子表格); 這也或許是這種復合文件的來由.

或許有了這個東西, 出品屬於自己的文件格式就成了輕而易舉的事情了.

存取和訪問復合文檔主要使用定義在 Activex 單元的三個 COM 接口:
IStorage (類似於 Windows 的目錄, 也就是文件夾);
IStream (類似於目錄中的文件, 不過在這裡都是"流", 每個流至少要占用 512 字節);
IEnumStatStg (用於列舉 IStorage 的層次結構)

"接口" 又是一個復雜的概念, 暫時把它認作是一組函數的集合吧.

7. 復制文件

procedure TForm1.Button1Click(Sender: TObject);

const

   SourceDir = 'C:\Temp\Folder1';{ 源文件夾必須存在 }

   DestDir = 'C:\Temp\Folder2'; { 如果目標文件夾不存在, 程序會自動創建 }

begin

  TDirectory.Copy(SourceDir, DestDir);

end;

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved