打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Delphi 文件处理(2)

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 文件读取


private    List: TStrings;    Fini: TIniFile;    Path: string;    Section,Key: string;    { Private declarations }  public    { Public declarations }  end;var  MainForm: TMainForm;implementationuses  ShellAPI;{$R *.dfm}{  INI File ===============================================================}procedure TMainForm.FormCreate(Sender: TObject);begin  Path := ChangeFileExt(ParamStr(0),'.ini');  Fini := TIniFile.Create(Path);end;//写入 Write  INIprocedure 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 INIprocedure TMainForm.Button2Click(Sender: TObject);var  s: string;begin  s := Fini.ReadString('Delphi xe Title','Astring Key','');  ShowMessage(s);end;//读取 字节Read ReadSections ....Sectionprocedure TMainForm.Button3Click(Sender: TObject);begin  List := TStringList.Create;  Fini.ReadSections(List);  ShowMessage(List.Text);    //Delphi xe Titleend;//读取关键字 Read  ReadSection  ...Keyprocedure TMainForm.Button4Click(Sender: TObject);begin  List := TStringList.Create;  Fini.ReadSection('Delphi xe Title',List);  ShowMessage(List.Text);  //AString Keyend;//删除节点DeleteKey procedure TMainForm.Button5Click(Sender: TObject);begin  Fini.DeleteKey('Delphi xe Title','AString Key');end;//删除全部  EraseSectionprocedure 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 关闭文件。




 var    F: Text;    FileName: string = 'D:\Delphi Study N\15.Delphi File\a.txt';{  Text File ================================================}//写入 Write Txtprocedure 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 Txtprocedure TMainForm.Button9Click(Sender: TObject);var  s: string;begin  AssignFile(F,FileName);  Reset(F);  Readln(F,s);  ShowMessage(s);  CloseFile(F);end;//增加 Add Txtprocedure 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 Txtprocedure 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: 写



另外: 包含长字符串、变量、类实例、接口或动态数组的记录不能写入类型文件中!


 


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 .datprocedure 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 datprocedure 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 datprocedure 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;







 


 


 


  
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
通过api访问ie cache
delphi Dll 中封装多窗体
Delphi 中的DLL 封装和调用对象技术
delphi 启动停止windows服务 转
delphi十个小技巧
Delphi UrlDownloadToFile 实现文件下载
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服