DELPHI基础教程:文件管理(一)[3]

DELPHI基础教程:文件管理(一)[3],第1张

记录文件的打开和创建

记录文件的打开和创建同文本文件一样也需要关联和初始化两个步骤 同文本文件唯一的不同是不能使用Append过程

记录文件缺省情况下以读写方式打开 如果想以只读或只写方式打开 则需要修改System单元中定义的变量FileMode的值

FileMode的取值和意义如下表

表 FileMode的取值和意义

━━━━━━━━━━━━━━

取值 意义

──────────────

只读

只写

读写

━━━━━━━━━━━━━━

FileMode是一个全局变量 对它的每次修改都将影响所有Reset的 *** 作 因此在打开自己的文件后应还原它的值

在本系统中 当用户按下 打开 按钮时 首先d出一个标准文件打开对话框 要求用户输入或选择文件名 确认后如果该文件名的文件存在 则用Reset打开 若不存在则创建 程序清单如下

procedure TRecFileForm OpenButtonClick(Sender: TObject)

begin

if OpenDialog Execute then

FileName := OpenDialog FileName

else

exit

AssignFile(MethodFile Filename)

try

Reset(MethodFile)

FileOpened := True

except

On EInOutError do

begin

try

if FileExists(FileName) = False then

begin

ReWrite(MethodFile)

FileOpened := True

end

else

begin

FileOpened := False

MessageDlg( 文件不能打开 mtWarning [mbOK] )

end

except

On EInOutError do

begin

FileOpened := False

MessageDlg( 文件不能创建 mtWarning [mbOK] )

end

end

end

end

if FileOpened = False then exit

Count := FileSize(MethodFile)

if Count>then

ChangeGrid

RecFileForm Caption := FormCaption+ +FileName

NewButton Enabled := False

OpenButton Enabled := False

CloseButton Enabled := True

end

首先系统试图用Reset打开一个文件 并置FileOpened为True 如果文件不能打开 则引发一个I/O异常 在异常处理过程中 首先检测文件是否存在 若不存在则创建这个文件 否则是其它原因引发的异常 则把FileOpend重置为False 并显示信息 文件不能打开 在文件创建过程中仍可能引发异常 因而在一个嵌套的异常处理中把FileOpened重置为False 并提示信息 文件不能创建

有关异常处理的内容请读者参看第十二章 这段程序说明 异常处理机制不仅能使我们的程序更健壮 而且为编程提供了灵活性

当用户按下 创建 按钮时 系统首先d出一个标准输入框 要求用户输入文件名 确认后系统首先检测文件是否存在 若存在则直接打开 否则创建一个新文件 打开或创建过程导致异常 则重置FileName和FileOpened两个全局变量

procedure TRecFileForm NewButtonClick(Sender: TObject)

begin

FileName := InputBox( 输入框 请输入文件名 )

if FileName = then Exit

try

AssignFile(MethodFile FileName)

if FileExists(FileName) then

begin

Reset(MethodFile)

Count := FileSize(MethodFile)

if Count>then

ChangeGrid

end

else

begin

Rewrite(MethodFile)

count :=

end

FileOpened := true

Except

on EInOutError do

begin

FileName :=

FileOpened := False

end

end

if FileOpened then

begin

NewButton Enabled := False

OpenButton Enabled := False

CloseButton Enabled := True

RecFileForm Caption := FormCaption+ +FileName

end

end

当文件打开或创建后 所要做的工作有

● 若文件非空 则计算文件长度 并用文件内容填充StringGrid

● 创建 打开 按钮变灰 关闭 按钮使能

● 把文件名附到窗口标题后

记录文件的读入和显示

定义一个全局变量Count用来保存文件中的记录个数 当文件装入时

Count := FileSize(MethodFile)

如果Count >则首先确定StringGrid 的高度 行数 为保证StringGrid 不会覆盖窗口下面的编辑框 定义一个常量MaxShow 当Count <MaxShow时 记录可全部显示 当Count >= MaxShow时 StringGrid 自动添加一个滚动棒 为保证滚动棒不覆盖掉显示内容 StringGrid 的宽度应留有余地

确定StringGrid 高度 行数的代码如下

With StringGrid do

if count <MaxShow then

Height := DefaultRowHeight * (Count+ )+

else

Height := DefaultRowHeight * MaxShow+

RowCount := Count+

end

而后从文件中逐个读入记录并显示在StringGrid 的相应位置

for i := to Count do

begin

Read(MethodFile MethodRec)

ShowMethod(MethodRec i)

end

ShowMehtod是一个过程 用来把一条记录填入StringGrid 的一行中 对于Name Condition域而言 只须直接赋值即可 而对Nature 域需要把枚举类型值转化为对应意义的字符串( : 微观 : 宏观 ) 而对Result域则需要把数值转化为一定格式的字符串

Str (MethodRec Result: : ResultStr)

StringGrid Cells[ Pos] := ResultStr

即Result显示域宽为 其中小数点后位数为

lishixinzhi/Article/program/Delphi/201311/25242

有以下办法复制整个文件夹:

1、使用  winexec 调用 xcopy 命令行:

winexec( 'xcopy d:\test e:\ /s/e', false)

2、调用 winAPI 函数

function CopyDir(const SourceDir,DestDir: string): Boolean

var

   lpFileOp: TSHFileOpStruct

begin

  with lpFileOp do

  begin

    Wnd    := Application.Handle

    wfunc  := FO_COPY

    pFrom  := pchar(SourceDir)

    pTo    := pchar(DestDir)

    fFlags := FOF_ALLOWUNDO

    

    hNameMappings         := nil

    lpszProgressTitle     := nil

    fAnyOperationsAborted := false

  end

  Result := SHFileOperation(lpFileOp) = 0

end

3、使用 delphi 文件函数编写:

function DoCopyDir(sDirName:StringsToDirName:String):Boolean

var

  hFindFile:Cardinal

  t,tfile:String

  sCurDir:String[255]

  FindFileData:WIN32_FIND_DATA

begin

  //记录当前目录

  sCurDir:=GetCurrentDir

  ChDir(sDirName)

  hFindFile:=FindFirstFile('*.*',FindFileData)

  if  hFindFile<>INVALID_HANDLE_VALUE   then

  begin

    if not DirectoryExists(sToDirName)   then

      ForceDirectories(sToDirName)

      repeat

        tfile:=FindFileData.cFileName

        if  (tfile='.') or (tfile='..')  then

          Continue

        if   FindFileData.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY   then

        begin

          t:=sToDirName+'\'+tfile

          if not DirectoryExists(t)  then

            ForceDirectories(t)

          if  sDirName[Length(sDirName)]<>'\'   then

            DoCopyDir(sDirName+'\'+tfile,t)

          else

            DoCopyDir(sDirName+tfile,sToDirName+tfile)

        end

        else

        begin

          t:=sToDirName+'\'+tFile

          CopyFile(PChar(tfile),PChar(t),True)

        end

      until   FindNextFile(hFindFile,FindFileData)=false

              ///     FindClose(hFindFile)

  end

  else

  begin

    ChDir(sCurDir)

    result:=false

    exit

  end

        //回到当前目录

  ChDir(sCurDir)

  result:=true

end

第一种方法,使用SelectDirectory 函数 ,在ShellApi中

procedure TForm2.BtSelectPathClick(Sender: TObject)

var

strCaption,strDirectory:String

wstrRoot:WideString

begin

strCaption:='这是浏览文件夹的说明文字,可以根据需要进行书写。'

+#13#10+'一般二行文字就满了。'

//该参数是浏览文件夹窗口的显示说明部分

wstrRoot:=''

//这个参数表示所显示的浏览文件夹窗口中的根目录,默认或空表示“我的电脑”。

SelectDirectory(strCaption,wstrRoot,strDirectory)

EdLocalPath.Text:=strDirectory

end

第二种方法

要求:利用Win32 API SHBrowseForFolder开启一个选择文件目录的对话框,预先定位到默认的目录,最后返回所选择的结果,如果没有进行选择(即单击“取消”结束选择)则返回空''。

代码如下:(以下两个函数定义需要在uses中引入两个单元ShlObj,Windows)

function BrowseCallbackProc(Wnd: HWNDuMsg: UINTlParam, lpData: LPARAM): Integer stdcall

begin

case uMsg of

BFFM_INITIALIZED: SendMessage(Wnd, BFFM_SETSELECTION, 1, lpData)

end

Result := 0

end

function BrowsFolder(const Folder: string): string

var

TitleName: string

lpItemID: PItemIDList

BrowseInfo: TBrowseInfo

DisplayName: array[0..MAX_PATH] of char

TempPath: array[0..MAX_PATH] of char

begin

Result := Folder

FillChar(BrowseInfo, sizeof(TBrowseInfo), #0)

BrowseInfo.hwndOwner := GetActiveWindow

BrowseInfo.pszDisplayName := @DisplayName

TitleName := '请选择一个目录'

BrowseInfo.lpszTitle := PChar(TitleName)

BrowseInfo.ulFlags := BIF_RETURNONLYFSDIRS

BrowseInfo.lpfn := BrowseCallbackProc

BrowseInfo.lParam := Integer(PChar(Folder))

lpItemID := SHBrowseForFolder(BrowseInfo)

if Assigned(lpItemId) then

begin

SHGetPathFromIDList(lpItemID, TempPath)

GlobalFreePtr(lpItemID)

Result := string(TempPath)

end

else

Result:=''

end

函数BrowsFolder是主体,传入参数即默认的目录,返回值即选择的结果。

BrowseCallbackProc是由SHBrowseForFolder执行时需要的回调(Call Back)函数。在这个函数中,截取了BFFM_INITIALIZED消息,在目录选择对话框初始化的时候,向对话框发送一个BFFM_SETSELECTION消息,选中默认的目录。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12080376.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存