Delphi如何处理不同类型的文件

参考:http://www.cnblogs.com/railgunman/articles/1800318.html

  程序设计当中,我们时常遇到需要处理文件、目录及驱动器的情况,这里将对如何处理不同类型的文件进行讲述

  主要包括如何使用 TFileStream 类封装文件的输入/输出以及如何利用 32 位windows的主要特征——内存映射文件。将会学到如何创建一个封装内存映射文件功能的 TMemoryMappedFile类,并用它在文本文件中进行文本查询。还提供了一些关于选择驱动器、在树形目录中查询文件以及获取文件版本信息的方法。使你对文件、目录及驱动器有深入的认识

处理文件的输入/输出

  你将要对三种文件进行处理:文本文件、类型文件、二进制文件

  以下几节是关于文件输入/输出的讲解。文本文件是指可被任意文本编辑器读取的ASCII文本。类型文件指包含有程序员定义的数据类型的文件。二进制文件包含其他所有的类型,它是对包含任意格式或无格式数据的文件的统称

文本文件的处理

  本文讲述使用内建于 Object Pascal运行时库中的过程和函数处理文本文件的方法。在对文本文件进行任何处理之前,首先要打开此文本文件。声明变量:通过此变量可以引用一个文本文件。

  打开一个文件需要两步:首先是 AssignFile(),它可以将文件变量与一个文件关联起来。接着进行第二步:打开文件。有三种方法打开文件:使用 ReWrite()过程创建并打开文件,对于一个已经存在的文件,此操作将使得文件被覆盖;使用Reset()过程只读地打开一个文件;使用Append()过程向已经存在的文件追加文本。

  注意Reset()将以可读写方式打开类型文件和无类型文件。可以使用 CloseFile()来关闭一个已经打开的文件

文件的打开和关闭

AssignFile 把一个外部文件名和一个文件变量相关联
Reset 打开一个存在的文件,文本文件(只读),其他文件(读写)
ReWrite 创建并打开一个新文件(或者覆盖已有的文件)
Append 以追加方式打开一个文件(只适用于文本文件)
CloseFile 关闭一个打开的文件
FileOpen 打开一个特定的文件并返回文件句柄
FileCreate 创建一个给定文件名的文件,并返回文件句柄
FileClose 关闭一个特定句柄的文件

  后面的三个文件主要提供系统内部使用,在文件复制的编程过程中也往往会用到。它们操作的对象时文件句柄,而不是文件变量

文件定位

Seek 把文件当前位置移至指定部分
FilePos 返回文件当前的位置
Eoln 返回行结束标志
EOF 返回文件结束标志
FileSeek 改变当前文件指针的位置

  还有一个问题,如何判断文件已打开?要不要读写完成之后就关闭文件,下次读或写时再打开?

用 TFileStream

  对于通过 Byte 数组进行文件操作的,在 FTP中经常会使用到,我也是在Delphi调用Web Service进行文件的上传和下载时找到这两个函数的,挺好用的,推荐给大家。(申明:非本人所写)

  <1>将Byte数组生成文件


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

procedure ByteArrayToFile(Const ByteArray : TByteDynArray; Const FileName : String);

var

    Conut : Integer;

    F : File of Byte;

    pTemp : Pointer;

begin

    AssignFile(F, FileName);

    ReWrite(F);

    try

        Count := Length(ByteArray);

        pTemp := @ByteArray[0];

        BlockWrite(F, pTemp^, Count);

    finally

        CloseFile(F);

    end;

end;

  <2>将文件生成Byte数组


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

function FileToByteArray(const FileName : String) :TButeBtnArray;

const

    BLOCK_SIZE = 1024;

var

    BytesRead, BytesToWrite, Count :Integer;

    F :Filw of Byte;

    pTemp : Pointer;

begin

    AssignFile(F, FileName);

    Reset(F);

    try

        Count := FileSize(F);

        SetLength(Result, Count);

        pTemp := @Result[0];

        BytesRead := BLOCK_SIZE;

        while(BytesRead = BLOCK_SIZE) do

        begin

            BytesToWrite := Min(Count, BLOCK_SIZE);

            BlockRead(F, pTemp^, BytesToWrite, BytesRead);

            pTemp := Pointer(LongInt(pTemp)+BLOCK_SIZE);

            Count := Count-BytesRead;

        end;

    finally

        CloseFile(F);

    end;

end;

  


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

function Encrypt(mStr : String; mKey : String) :String;

var

    I, J :Integer;

begin

    J:=1;

    Result := ‘‘;

    for I:=1 to Length(mStr) do begin

        Result := Result + Char(Ord(mStr[I] xor Ord(mKey[j]));

        if J + 1 <= Length(mKey) then

            Inc(J)

        else

            J:=1;  

    end;

    {自己加步骤}

end;

  


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

function Decrypt(mStr : String; mKey : String) :String;

var

    I,J: Integer;

begin

    J :=1;

    Result := ‘‘;

    {自己加步骤}

    for I :=1 to Length(mStr) do begin

        Result := Result + Char(Ord(mStr[I] xor Ord(mKey[J]));

        if J+1 <= Length(mKey) then;

            Inc(J)

        else

            J:=1;

    end;

end;

  


1

2

3

4

5

6

7

8

9

10

11

12

procedure TForm1.Button1Click(Sender : TObject);

const

    cKey1 = ‘谁想试试怎么破‘;

    cKey2 = ‘我可不愿意这样玩(1)我可不愿意这样玩(2)我可不愿意这样玩(3)‘;

    cKey3 = ‘Memo2.Text := Decrypt(Encrypt(Memo1.Text, cKey), cKey);‘;

var

    S :String;    //加密后的字符

begin

    S := Encrypt(Encrypt(Encrypt(Memo1.Text, cKey1), cKey2), cKey3);

    ShowMessage(S);

    Memo2.Text := Decrypt(Decrypt(Decrypt(S, cKey3), cKey2), cKey1);

end;

时间: 2024-10-11 09:53:45

Delphi如何处理不同类型的文件的相关文章

Solr 如何处理日期类型

Solr日期类型处理 Solr 如何处理日期类型 日期格式与实际时间晚8小时 solr控制台查询出的日期格式与实际时间少8个小时,因为我们是东八区,推测是时区的原因. 造成这个问题的根源是东八区的人不习惯零时区的时间.其实,solr索引存储的时间并没有少8小时,只是在时间格式化的时候,用的是UTC时间,因为我们是东八区,UTC是零时区时间,所以日期展示的时候,看起来是慢了8小时. 误区一:修改写入时间 为了解决这个问题,在solrJ写入时间时,修改时间,增加8小时.这种方案相当于篡改了数据,是不

Delphi XE6记录类型赋值

program Project1; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; TYPE Trec = record Member1, Member2: Integer; end; CONST IntRec: Trec = (Member1: 55; Member2: 2); begin Writeln(IntRec.Member1); Writeln(IntRec.Member2); Readln; end. 定义的时候,是可以进行赋

MAC Terminal 用颜色区分不同类型的文件

Terminal 下不同类型的文件显示不同的颜色Terminal 默认的 shell 是 bash (提示符是 $)在 ~ 先建立一个文件  ~/.bash_profile 加入下面的两行:export CLICOLOR=1export LSCOLORS=gxfxaxdxcxegedabagacad 存盘, 退出Terminal, 重起Terminal.更改LSCOLORS可以有不同的颜色效果.

linux列出一个目录及其子目录下面的某种类型的文件

linux列出一个目录及其子目录下面的某种类型的文件 作者:smarteng ⁄ 时间:2009年07月09日 ⁄ 分类: Linux命令 ⁄ 评论:0 怎么样把,一个目录及其所有的子目录下面的某种类型(比如*.gif)的文件全部列出来?这些子目录下面可能还包含有目录,要想全部列出*.gif的文件 find . -name "*.gif" linux find命令-exec参数的使用说明(笔记) 关键词: Linux   find -exec 前言:最近几天使用find的高级功能,但执

Delphi 封装Frame到Dll文件

做项目的时候,发现这个Frame很好用,为了省空间.调用和修改方便,就将Frame封装到dll(动态链接库)里面,确实很好使. 效果图如下: 上图是临时测试用的,忘了将Frame的align设置成alClient,不过刚好可以看出来白色区域是从dll里加载的Frame,还调用了Frame的按钮单击事件. 下面是大概的建立流程: 1.File -> New -> Other -> Delphi Projects -> 新建一个Dll文件 2.然后继续 File -> New -

linux查找特定类型的文件中是否包含特定字段

shell是个好东西,极大的方便了查询工作,之前遇到一个问题,查询包含有特定字段的特定文件,经过查询,命令如下: 1 find . -type f -name '*.cpp' print|xargs grep -r '#include' -l 上述命令的意思是查询包含有 '#include' 字符的 cpp文件,并给出文件名列表.具体需要熟悉find 和grep命令和各个参数的意思. 参考链接:http://blog.sina.com.cn/s/blog_691a84f301015khx.htm

Mime类型与文件后缀对照表及探测文件MIME的方法

说明:刚刚写了一篇<IHttpHandler的妙用(2):防盗链!我的资源只有我的用户才能下载>的文章,网址:http://blog.csdn.net/zhoufoxcn/archive/2008/01/11/2036995.aspx.估计很多朋友对不同后缀的文件对应的MIME类型不熟悉(实际上这么多我也记不住),所以将平常常见的一些文件后缀对应的MIME类型写了一个对照表,现在奉献给大家: 文件后缀 MIME 备注 *.avi video/x-msvideo 视频文件 *.aif *.aif

Linux复制指定目录及子目录下特定类型的文件

主要参考这个: http://www.2cto.com/os/201208/144996.html 拷贝一些内容就是: 首先建立一个用于测试的目录 可见,目录中主要包含用于测试的*.txt文件和用于充当炮灰的*.tes文件 目标是保持当前的目录结构,只把txt文件复制出来 方法一:当不需要的文件类型较为单一时,可以通过完全复制然后删除指定类型的文件完成 Step1 使用命令 cp -r test/ test2 将测试目录test下所有内容完全复制到test2. Step2 组合使用find及xa

[转]Delphi 变体类型(Variant)的介绍(流与变体类型的相互转换、变体类型常用的函数)

Delphi 变体类型(Variant)的介绍(流与变体类型的相互转换.变体类型常用的函数) 一.变体类型常用的函数介绍: Variant: 一种可以拥有各种数据类型: 也可以告诉目前存储的数据是什么类型(通过使用VarType函数): 可以给相同的Variant分配不同的数据类型,只要Variant包含数字值就可以执行算法: variant数组只不过是variant型的数组,不必包含同类型的数据: 1.  VarArrayOf函数:更快捷的创建一维变体数组,可以创建全异的数值数组: funct