软件大多都要对文件 磁盘进行 *** 作 熟悉掌握这些函数可以帮助你轻松实现创建 删除 保存文件等功能
Append功能说明 追加内容到文件中 文件必须要存在
参考实例
var
S String
F TextFile
begin
S = This is a book
AssignFile(F C \MyFile txt ) // 将C \MyFile txt文件与F变量建立连接 后面可以使用F变量对文件进行 *** 作
Append(F) // 以追加的方式打开文件
Writeln(F S) // 将S变量中的内容追加到文本尾后
CloseFile(F) // 关闭文件
end
AssignFile功能说明 与指定的文件建立连接
参考实例
var
F TextFile // 声明文本文件类型变量
begin
AssignFile(F C \MyFile txt ) // 将C \MyFile txt文件与F变量建立连接 后面可以使用F变量对文件进行 *** 作
end
ChDir功能说明 改变当前目录(文件夹)
参考实例
var
sDir String
begin
sDir = C \Windows
ChDir(sDir) // 此时 系统的当前目录则为C \Windows目录
end
CloseFile功能说明 关闭文件 当对文件的 *** 作完成后 应该使用CloseFile函数关闭打开的文件
参考实例
var
S String
AllText String
F TextFile
begin
AssignFile(F C \MyFile txt ) // 将C \MyFile txt文件与F变量建立连接 后面可以使用F变量对文件进行 *** 作
Reset(F) // 打开文件
while not EOF(F) do begin // 使用While循环 一直判断是否到了文件未尾
Readln(F S) // 读取一行文本
AllText = AllText + S
end
CloseFile(F) // 关闭文件
end
DeleteFile功能说明 删除指定的文件 该函数只有一个参数 此参数为欲删除文件的完整路径 如果删除成功 则返回True 若删除失败 或文件不存在则返回False
参考实例
var
IsOK Boolean // 用于保存删除状态
begin
IsOK = DeleteFile( C \My Documents\l ) // 函数执著后 将结果返回给IsOK变量 如果IsOK变量为True 则表示文件删除成功
if IsOK then ShowMessage( 文件删除成功! )
else ShowMessage( 文件删除失败! )
end
DirectoryExists功能说明 检测指定的文件夹否存在 如果存在则返回True 反之则为False
参考实例
var
IsExists Boolean
begin
IsExists = DirectoryExists ( C \Windows )
if IsExists then ShowMessage( Windows文件夹存在! )
else ShowMessage( Windows文件夹不存在! )
end
DiskFree功能说明 获取指定磁盘的剩余空间 该函数只有一个参数 该参数用于指定要获取剩余空间的磁盘号 当参数为 时 表示获取当前磁盘的剩余空间 为A盘 为B盘 以此类推 如果返回值为
表示指定的磁盘无效
参考实例
var
FreeSize Int
begin
FreeSize = DiskFree( ) // 获取C盘中的剩余空间 返回的值是以 字节 为单位的
end
DiskSize功能说明 获取指定磁盘的空间 该函数只有一个参数 该参数用于指定要获取磁盘空间的磁盘号 当参数为 时 表示获取当前磁盘的空间 为A盘 为B盘 以此类推 如果返回值为 表示指
定的磁盘无效
参考实例
var
DiskSize Int
begin
DiskSize = DiskSize( ) // 获取C盘的空间 返回的值是以 字节 为单位的
end
EOF功能说明 判断文件指针是否移动到了文件未尾 当EOF函数返回值为True时 则不可以使用Readln函数进行读取文件了
参考实例
var
S String
AllText String
F TextFile
begin
AssignFile(F C \MyFile txt ) // 将C \MyFile txt文件与F变量建立连接 后面可以使用F变量对文件进行 *** 作
Reset(F) // 打开文件
while not EOF(F) do begin // 使用While循环 一直判断是否到了文件未尾
Readln(F S) // 读取一行文本
AllText = AllText + S
end
end
Erase功能说明 删除文件
参考实例
var
F File
begin
AssignFile(F C \MyFile txt ) // 将C \MyFile txt文件与F变量建立连接 后面可以使用F变量对文件进行 *** 作
Reset(F) // 打开文件
CloseFile(F) // 关闭文件
Erase(F) // 删除文件 在删除文件之前必须先关闭文件
end
FileExists功能说明 检测指定的文件否存在 如果存在则返回True 反之则为False
参考实例
var
IsExists Boolean
begin
IsExists = FileExists( C \Test txt )
if IsExists then ShowMessage( 该文件存在! )
else ShowMessage( 该文件不存在! )
end
FileSize功能说明 获取文件大小 返回的结果是字节为单位
参考实例
var
F file of Byte
nSize Longint
begin
AssignFile(F C \MyFile txt ) // 将C \MyFile txt文件与F变量建立连接 后面可以使用F变量对文件进行 *** 作
Reset(F) // 打开文件
nSize = FileSize(F) // 获取文件大小
CloseFile(F) // 关闭文件
end
ForceDirectories功能说明 创建新的子目录 路径中不存在的目录将一同创建
参考实例
ForceDirectories( C \Flash\MyFolder ) // 如果Flash文件夹本身不存的话 那么将会先创建Flash文件夹 然后再创建MyFolder文件夹
MkDir功能说明 创建一个新的子目录(文件夹)
参考实例
MkDir( C \MyFolder ) // 在C盘根目录中创建了一个名叫MyFolder的文件夹
需要注意的是 如果在本身不存在的目录中创建子目录将会失败 比如C盘根本不存在Flash文件夹 写成MkDir( C \Flash\MyFolder ) 这样将不能成功创建MyFolder文件夹
Reset功能说明 以只读方式打开文件
参考实例
var
F TextFile // 声明文本文件类型变量
begin
AssignFile(F C \MyFile txt ) // 将C \MyFile txt文件与F变量建立连接 后面可以使用F变量对文件进行 *** 作
Reset(F) // 打开文件
end
Rewrite功能说明 以可写方式打开文件 如果文件不存在 将会自动创建 使用该函数 将会覆盖文件中的所有内容
参考实例
var
F TextFile // 声明文本文件类型变量
begin
AssignFile(F C \MyFile txt ) // 将C \MyFile txt文件与F变量建立连接 后面可以使用F变量对文件进行 *** 作
Rewrite(F) // 打开文件 如果文件不存在 将会在C盘中创建MyFile txt文件 如果文件存在 将会覆盖MyFile txt中的所有内容
end
Readln功能说明 读取一行文本
参考实例
var
S String
F TextFile
begin
AssignFile(F C \MyFile txt ) // 将C \MyFile txt文件与F变量建立连接 后面可以使用F变量对文件进行 *** 作
Reset(F) // 打开文件
Readln(F S) // 读取一行文本到S变量中
end
Rename功能说明 更改文件名
参考实例
var
F File
begin
AssignFile(F C \MyFile txt ) // 将C \MyFile txt文件与F变量建立连接 后面可以使用F变量对文件进行 *** 作
ReName(F C \NewFile txt ) // 更名为NewFile txt
end
Writeln功能说明 写入一行文本
参考实例
var
S String
F TextFile
begin
S = This is a book
AssignFile(F C \MyFile txt ) // 将C \MyFile txt文件与F变量建立连接 后面可以使用F变量对文件进行 *** 作
Rewrite(F) // 创建新文件
Writeln(F S) // 将S变量中的内容写入文本中
lishixinzhi/Article/program/Delphi/201311/8445
画出每个自画项目
这在TabSet的OnDrawTab事件处理过程中完成 这一事件处理过程的参数中包含了待画项目索引 画板 待画区域 是否被选中等 这里我们只利用了前三个参数 事实上利用最后一个参数 我们可以对被选中的标签进行一些特殊的视觉效果处理 这一工作就留给读者自己去完成
procedure TFMForm DriveTabSetDrawTab(Sender: TObjectTabCanvas: TCanvas
R: TRectIndex: IntegerSelected: Boolean)
var
Bitmap: TBitmap
begin
Bitmap := TBitmap(DriveTabSet Tabs Objects[Index])
with TabCanvas do
begin
Draw(R Left R Top + Bitmap)
TextOut(R Left + + Bitmap Width R Top + DriveTabSet Tabs[Index])
end
end
文件管理基本功能的实现
在子窗口的File菜单中 定义了文件管理的基本功能 它们是
● Open :打开或运行一个文件(从文件列表框双击该文件可实现同样效果)
● Move :文件在不同目录间的移动
● Copy :文件拷贝
● Delete :文件删除
● Rename :文件更名
● Properties :显示文件属性
文件打开
文件打开功能可以运行一个可执行文件 或把文件在与之相关联的应用程序中打开 文件总是与创建它的应用程序相关联 这种关联可以在Windows的文件管理器中修改 要注意的是 文件的关联是以后缀名为标志的 因而对一个文件关联方式的修改将影响所有相同后缀名的文件
文件打开功能实现的关键是利用了Windows API函数ShellExecute 由于Windows API函数的参数要求字符串类型是PChar 而Delphi中一般用的是有结束标志的String类型 因此为调用方便我们把这一函数进行了重新定义如下
function ExecuteFile(const FileName Params DefaultDir: String
ShowCmd: Integer) THandle
var
zFileName zParams zDir: array[ ] of Char
begin
Result := ShellExecute(Application MainForm Handle nil
StrPCopy(zFileName FileName) StrPCopy(zParams Params)
StrPCopy(zDir DefaultDir) ShowCmd)
end
以上函数在fmxutils单元中定义 fmxutils是一个自定义代码单元
有关ShellExecute中各参数的具体含义读者可查阅联机Help文件
StrPCopy把一个Pascal类型的字符串拷贝到一个无结束符的PChar类型字符串中
在子窗口的Open Click事件处理过程中
procedure TFMForm Open Click(Sender: TObject)
begin
with FileList do
ExecuteFile(FileName Directory SW_SHOW)
end
如果FileList允许显示目录的话(即FileType属性再增加一项ftDirectory) 那么对于一个目录而言 打开的含义应该是显示它下边的子目录和文件 程序修改如下
procefure TFMForm Open Click(Sender: Tobject)
begin
With FileList do
begin
if HasAttr(FileName faDirectory) then
DirectoryOutline Directory := FileName
else
ExecuteFile(FileName Directory SW_SHOW)
end
end
其中HasAttr是一个fmxutils单元中的自定义函数 用于检测指定文件是否具有某种属性
function HasAttr(const FileName: StringAttr: Word) Boolean
begin
Result := (FileGetAttr(FileName) and Attr) = Attr
end
文件拷贝 移动 删除 更名
文件拷贝的关键是使用了以文件句柄为 *** 作对象的文件管理函数 因而提供了一种底层的I/O通道 在Object Pascal中这一点是利用无类型文件实现的
在文件拷贝中首先检查目标文件名是否是一个目录 如是则把原文件的文件名添加到目标路径后 生成目标文件全路径名 而后提取源文件的时间戳 以备拷贝完成后设置目标文件 拷贝过程中使用了返回文件句柄或以文件句柄为参数的文件管理函数FileOpen FileCreate FileRead FileWrite FileClose 为保证文件的正常关闭和内存的释放 在拷贝过程中进行异常保护
过程CopyFile实现上述功能 它定义在fmxutils单元中
procedure CopyFile(const FileName DestName: TFileName)
var
CopyBuffer: Pointer
TimeStamp BytesCopied: Longint
Source Dest: Integer
Destination: TFileName
const
ChunkSize: Longint =
begin
Destination := ExpandFileName(DestName)
if HasAttr(Destination faDirectory) then
Destination := Destination + \ + ExtractFileName(FileName)
TimeStamp := FileAge(FileName)
GetMem(CopyBuffer ChunkSize)
try
Source := FileOpen(FileName fmShareDenyWrite)
if Source <then
raise EFOpenError Create(FmtLoadStr(SFOpenError [FileName]))
try
Dest := FileCreate(Destination)
if Dest <then
raise EFCreateError Create(FmtLoadStr(SFCreateError [Destination]))
try
repeat
BytesCopied := FileRead(Source CopyBuffer^ ChunkSize)
if BytesCopied >then
FileWrite(Dest CopyBuffer^ BytesCopied)
until BytesCopied <ChunkSize
finally
FileSetDate(Dest TimeStamp)
FileClose(Dest)
end
finally
FileClose(Source)
end
finally
FreeMem(CopyBuffer ChunkSize)
end
end
如果我们不使用FileSetDate过程 Windows自动把当前时间作为时间戳写入文件
文件移动事实上是文件拷贝与文件删除的结合 fmxutils单元中的MoveFile过程实现了这一功能
procedure MoveFile(const FileName DestName: TFileName)
var
Destination: TFileName
begin
Destination := ExpandFileName(DestName)
if not RenameFile(FileName Destination) then
begin
if HasAttr(FileName faReadOnly) then
raise EFCantMove Create(Format(SFCantMove [FileName]))
CopyFile(FileName Destination)
DeleteFile(FileName)
end
end
EFCanMove是一个自定义异常类
type
EFCanMove := Class(EStreamError)
有关自定义异常类请参阅第十二章
文件删除 文件更名直接调用Delphi文件管理过程DeleteFile RenameFile 它们都以文件名为参数 *** 作执行前应d出一个对话框进行确认 执行完毕后应调用Update方法更新FileList的显示
lishixinzhi/Article/program/Delphi/201311/25232
函数NotInList用于判断待添加的字符串是否已存在于一个TStrings对象中 函数返回一个布尔型变量
NotInList的具体实现如下
Function TFileCtrForm NotInList(FileName: StringItems: TStrings) Boolean
var
i: Integer
begin
for I := to Items Count do
if Items[i] = FileName then
begin
NotInList := False
Exit
end
NotInList := True
end
按指定匹配字符串显示当前目录中的文件
当在FileEdit中输入一个匹配字符串 并回车 文件列表框将显示匹配结果 这一功能在FileEdit的OnKeyPress事件中实现
procedure TFileCtrForm FileEditKeyPress(Sender: TObjectvar Key: Char)
begin
if Key = # then
begin
FileListBox ApplyFilePath(FileEdit Text)
Key := #
end
end
文件列表框提供的ApplyFilePath方法是解决这一问题的关键所在
按指定匹配字符串查找当前目录中的文件
为了进行比较 我们用另一种方法来实现文件的查找功能 即利用标准过程FindFirst FindNext FileList 与ListBox 中的内容完全一致
当用户单击 查找 按钮时 与FileEdit 中字符串相匹配的文件将显示在ListBox 中 下面是实现代码
procedure TFileCtrForm Button Click(Sender: TObject)
var
i: Integer
SearchRec: TSearchRec
begin
Searched := True
Label Caption := Search Result
ListBox Items Clear
FindFirst(FileEdit text faAnyFile SearchRec)
ListBox Items Add(SearchRec Name)
Repeat
i := FindNext(SearchRec)
If i = then
ListBox Items Add(SearchRec Name)
until i <>
end
SearchRec是一个TSearchRec类型的记录 TSearchRec的定义如下
TSearchRec = record
Fill: array[ ] of Byte
Attr: Byte
Time: Longint
Size: Longint
Name: string[ ]
end
在这一结构中提供了很多信息 灵活应用将给编程带来很大方便 下面我们举几个例子
检测给定文件的大小
function GetFileSize(const FileName: String) LongInt
var
SearchRec: TSearchRec
begin
if FindFirst(ExpandFileName(FileName) faAnyFile SearchRec) = then
Result := SearchRec Size
else
Result :=
end
这一程序将在下一节中应用
获取给定文件的时间戳 事实上等价于FileAge函数
function GetFileTime(const FileName: String) Longint
var
SearchRec: TSearchRec
begin
if FindFirst(ExpandFileName(FileName) faAnyFile SearchRec) = then
Result := SearchRec Time
else
Result :=
end
检测文件的属性 如果文件具有某种属性 则
SearchRec Attr And GivenAttr >
属性常量对应的值与意义如下表
表 属性常量对应的值与意义
━━━━━━━━━━━━━━━━━━━━
常量 值 描述
─────────────────────
faReadOnly $ 只读文件
faHidden $ 隐藏文件
faSysFile $ 系统文件
faVolumeID $ 卷标文件
faDirectory $ 目录文件
faArchive $ 档案文件
faAnyFile $ F 任何文件
━━━━━━━━━━━━━━━━━━━━
文件管理综合举例 文件管理器的实现
在本章的最后 我们利用Delphi提供的文件控件和文件管理函数开发一个简单的文件管理器 虽然这一文件管理器还无法和Windows提供的文件管理器相比拟 但它也为一般的文件 *** 作提供了足够多的功能 而且如果读者感兴趣 还可以对它做进一步的扩充 在后边的拖放 *** 作一章中 我们就为它提供了拖放支持 使它看起来更象一个 文件管理器
设计基本思路
窗口设计
文件管理器的主窗口是一个多文档界面(MDI) 有关文件 目录的显示和文件管理功能的实现都放在子窗口中 在程序执行过程中将根据需要d出一些完成不同 *** 作的对话框 这些对话框都是在需要时动态生成的 表 给出了本程序所设计窗体的清单
表 FileManger窗体清单
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
窗体类 功能 用于创建该类窗体的菜单项
──────────────────────────────────────
TFileManager 主窗口
TFMForm 子窗口 Windows|New Window
TFileAttrForm 显示文件属性 File|PropertiesFunction|Search
TChangeForm 文件移动 拷贝 改名 改变 File|Move Cope Rename 当前目录等 *** 作的输入对话框 Directory|change Directory
TSearchForm 输入待查找文件的名称和路径 Function|Search
TDiskViewForm 显示磁盘信息 Function|Disk View
TViewDir 输入待创建的子目录 Directory|CreateDirectory
TAboutBox 显示版权信息 Help|About
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
界面设计
主窗口界面主要是主菜单和用于表示当前目录 当前文件的状态条
表 主窗口界面设计
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
部件 属性 功能
─────────────────────────────
FileManager Style=fsMDI 主窗口
WindowMenu=Windows
Position=poDefault
MainMenu 主菜单
FilePanel Align=alBottom 显示当前选中文件
BevelInner=bvLowered
BevelWidth=
DirectoryPanel Align=alBottom 显示当前选中目录
Alignment=taLeftJustify
BevelInner=bvLowered
BevelWidth=
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
主窗口主菜单包括File WIndows Help三项 File菜单项在子窗口生成时被子窗口同名菜单项所取代 设置Windows Help的GroupIndex = 可以使子窗口生成时这两个菜单项仍存在
子窗口界面包括主菜单 目录树(DirectoryOutline) 文件列表框 用于显示驱动器的标签集(TabSet)以及三个用于显示驱动器类型的TImage部件
表 子窗口界面设计
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
部件 属性 功能
───────────────────────────────────────
FMForm ActiveControl=DirectoryOutline 子窗口
Position=poDefault
Style=fsMDIChild
MainMenu 主菜单
DriveTabSet Align=alTop 显示驱动器
style=tsOwnerDraw
DirectoryOutline Align=alLeft 显示当前驱动器的目录树
options=[ooDrawTreeRoot
ooDrawFocusRect ooStretchBitmaps]
FileList Align=alClient 显示当前目录中的文件
FileType=[ftReadOnly
ftHidden ftSystem ftArchive ftNormal]
ShowGlyphs=True
Neork(Image) Picture(Neork bmp) 标志网络驱动器
Vsible=False
Floppy(Image) Picture(Floppy bmp) 标志软驱
Visible=False
Fixed(Image) Picture(Fixed bmp) 标志硬驱
Visible=False
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
lishixinzhi/Article/program/Delphi/201311/25238
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)