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;
- 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 关闭文件。
- 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: 写
另外: 包含长字符串、变量、类实例、接口或动态数组的记录不能写入类型文件中!
- 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;