Delphi 文件传输

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Delphi 文件传输相关的知识,希望对你有一定的参考价值。

我想用delphi实现文件互传。注意是互传,不是单方面的传输。
看了网上很多的代码,基本都是分发送端和接收端。分别使用server和client。
为了实现文件互传,我曾经想把client和server的代码整合到一起,
但是这样有一个问题,如果其中一台机器处于内网,那么外网的机器是无法主动连接到它的,也就无法传送文件了。
这个问题困扰我好几天了,希望各位高手给点思路。

1.既然你要实现文件互传,那一般只能使用TCP方式(因为文件数据量一般比较大),那么在服务端使用TCP控件Listen,在客户端也使用TCP控件进行连接(connect),然后就可以了。如果你要实现双向传输,正如你所说,两边都要有服务端和客户端,即做一个软件,放两个TCP控件,一个用于服务端,一个用于客户端。
2.至于你后面一种情况,实际上这是一个你无法直接通过编程解决的问题(本质上是NAT,即1个外网IP=n个内网IP)。目前解决的方法是:
1)使用VPN,现成的是VNN软件(北京一个公司开发的,可以免费使用7天);
2)自己做个中转(中转软件运行一定要有外网地址),然后实现文件传输前,两个传输方都登录中转,所有传输通过中转软件就可以了。
目前我只知道这两种方法,如果有第三种,也请告诉我,谢谢!
参考技术A 在网上做一个中转服务器,供你的客户端打洞之用,就像qq那样,申请一个免费域名就可以连接了,客户端上线后要主动连接服务器,然后每秒钟都向服务器发心跳维持这个洞,然后2个客户端互传文件的时候由服务器负责通知他们进行互相打洞就可以连接了

Delphi中的文件类型

文件是同一类型元素的有序集合,是内存与外设间传输数据的渠道。一些外设如显示器、键盘、打印机等都可以看作文件,但最常用的还是磁

盘文件,这也是这节课我们主要讨论的对象。

         Delphi继承了Object Pascal的文件管理功能,并有很大的发展,其中最主要的是提供了用于文件管理的标准控件,同时也提供了更

多的文件管理函数。
         首先会介绍Delphi文件管理的基本概念和标准过程/函数,并提供了一个记录文件的应用实例。而后介绍Delphi提供的文件控件的使

用方法。

6.1 文件类型和标准过程 

        Delphi同Object Pascal一样支持三种文件类型,即:文本文件、类型文件、无类型文件。 

6.1.1文本文件 

      文本文件类型的变量用如下方法声明:

var

TextFileVar: Text ; 

       文本文件是以行为单位进行读、写操作的。由于每一行长度不一定相同,不能计算出给定行在文件中的确切位置,因而只能顺序地读写

。而且文本文件只能单独为读或写而打开,在一个打开的文本文件上同时进行读、写操作是不允许的。 

6.1.1.1 文本文件的打开、关闭 

      文本文件的打开需要两个步骤:(1). 文件变量与文件名关联;(2). 初始化读写。

      关联文件变量与文件名调用AssignFile标准过程: 

AssignFile ( TextFileVar , ‘G:G_delphi op.3800hk.com第七课文件类型.txt‘ ) ; 

     FileName 既可以是全路径名,也可以仅是文件名。对于后者系统将在当前目录下查找。

       AssignFile是Delphi新提供的一个函数,其功能等价于Object Pascal中的Assign。而Assign在Delphi中更多地被用作一个方法名。

初始化读写有三种方式:

1. Reset : 为读打开文件并把文件指针移动到文件首;

2. Rewrite : 为写创建一个新文件;

3. Append : 为写打开存在的文件并把文件指针定位在文件尾。

        当使用Reset或Append过程而文件不存在时将会引发一个I/O异常。

       文件的关闭很简单,只须调用CloseFile过程即可。

        虽然Delphi应用程序在退出时会自动关闭所有打开的文件,但自己动手关闭文件可以确保释放文件句柄,并使程序的可移植性增强。

        为保持兼容,Delphi也允许用户用Assign建立关联,Close关闭文件。 

举例代码:
var 
    MyTextFile:Textfile;
begin
    assignfile(MyTextFile,‘MyTextfile.txt‘);
    reset(MyTextfile);
    //rewrite(MyTextFile);
    //append(MyTextFile);
try
        {对文件进行操作}
finally
        closefile(Mytextfile);
end;
end;

\\\\\\\\\\\\\

文本文件的读写 

        从文本文件中读取信息用Read、Readln两个标准过程。

        当读入数值时,Read、Readln假定数值是用一个或多个空格分开的,而不是逗号、分号或其它字符。对如下一条语句: 

Read ( TextFileVar , Num1 , Num2 , Num3 ) ; 

      如果文件中的数值是:

100 200 300

      则能够成功读入,而若文件中的数值是

100 200, 300

      则Read读入“200,”并试图把它转化成一个数值时会引发一个异常。

       当读入字符是字符串时,Read、Readln过程总是读取尽可能多的字符填充到字符串变量中或一直读到行结束符为止。因此从文本文件中读取格式化的字符串数据,必须声明与其长度相匹配的字符串变量。如果要从文件中读取单词,必须先把文件中的每一行读入字符串,然后再从字符串中逐个分析出单词。或者一次只从文本文件中读入一个字符并测试每个字符后是否是单词断开处。

        格式化字符串之间的分隔符应读入到一个临时变量中,而字符串与数值、数值与数值间的分隔符读入时会自动识别剔除。对如下一行数据:

Mon 12:10 40 50

定义 

var

Day: string[3] ;

Time: string[5] ;

Num1, Num2: Integer ; 

则须用如下的read 语句读入: 

read ( TextFileVar , Day , c , Time , Num1 , Num2 ) ; 

C为一个临时字符变量。 

演示代码:

{var
    MyTextFile:Textfile;
  Day: string[3] ;
  Time: string[5] ;
  Num1, Num2: Integer ;
  c: char;
begin
    assignfile(MyTextFile,‘G:G_delphi op.3800hk.com第七课plMyTextfile.txt‘);
    reset(MyTextfile);
    //rewrite(MyTextFile);
    //append(MyTextFile);
try
        {对文件进行操作}
     read ( MyTextfile , Day , c , Time , Num1 , Num2 ) ;

finally
        closefile(Mytextfile);
end;

showmessage(‘day is :‘+day+‘  time is :‘+time+‘  and the orther num is : ‘ +inttostr(num1)+‘  ‘+inttostr(num2));
end;}

文本文件的编辑 

        在Delphi中实现对一个文本文件的编辑,只须让其与一个Tmemo控件建立关联即可: 

Memo1.Lines.LoadFromFile ( TextFileName ) ; 

这样在TMemo上所做的一切修改当调用Memo控件的SaveToFile方法后都会反映到文件中去。 
// Memo1.Lines.LoadFromFile (TextFileName) ;读(加载)文件。
 memo1.Lines.SaveToFile(TextFileName);保存文件。
\\\\\\\\\\\\\\

by clin003 at 20070528 from:http://blog.csdn.net/clin003
6.1.2 类型文件 

       记录文件是一种操作更为灵活的文件类型。它允许同时为读和写打开,而且由于记录文件中每条记录的长度固定,所以可随机存取。

记录文件的类型变量可如下声明: 
type
    Tperson = packed record
        FirstName:string[20];
        LastName:string[20];
        Age:integer;
end;

var

RecordFileVar: file of Tperson; 

RecordType是一个自定义的记录类型。

例子代码:
var 
    personFile:file of Tperson;
    person:Tperson;
begin
    assignfile(personFile,‘personfile.dat‘);
    reset(personFile);
try
    if not Eof (personFile) then
        read(personFile,person);
finally
    closeFile(personfile);
end;
end;



6.1.3 无类型文件 

      无类型文件提供了底层的I/O通道,可用于存取可变长度记录的文件。经常用于文件的复制操作中。由于Delphi提供了更好的方法,
所以无类型文件很少使用。有兴趣的读者可参看BlockRead、BlockWrite两个联机帮助主题。 
无类型文件声明:
var
Untypedfile:file;
buf:array[0..128] of byte;
这样就声明拉一个由数据块序列组成的文件,每个数据块为128字节大小的数据。

以上是关于Delphi 文件传输的主要内容,如果未能解决你的问题,请参考以下文章

大幅提升Delphi Datasnap数据传输效率的方法

用TTcpClient和TTcpServer进行文件的传输

Delphi中的文件类型

delphi10用布署上传文件

SQL Server / Delphi:如何使用表变量类型将整数列表作为参数传输?

Delphi编程中Http协议应用