delphi如何解决文件读写冲突

delphi如何解决文件读写冲突,第1张

文件链丛进行加锁时,设置一个超时时间。

超时设置可以为1ms,如果在时间内没有获得锁就反复获得,直接获得到对文件 *** 作权为止。如果超圆唤腊时限橘滑制已到,就必需马上退出,让出锁让其它进程来进行 *** 作,这样就可以解决冲突问题。

Delphi文本文件读写

Delphi 支持三种文件类型: 文本文件、记录文件、无类型文件。

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

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

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

1.文件变量与文件名关联:

AssignFile(VarTxt, FileName)

FileName 如果省略路拿野漏径将默认当前目录。

2.初始化读写有三种方式:

(1) Reset: 只读打开, 指针移到文件头

(2) Rewrite: 创建新文件并打开, 只写

(3) Append: 从尾部追加, 指针当然在文件尾。

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

最后用 CloseFile 关闭文件。

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

--------------------------------------------------------------------------------

//读写示例:

unit Unit1

interface

uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls

type TForm1 = class(TForm)

Memo1: TMemo

Button1: TButton

Button2: TButton

Button3: TButton

Button4: TButton

Button5: TButton

Button6: TButton

Button7: TButton

procedure Button1Click(Sender: TObject)

procedure Button2Click(Sender: TObject)

procedure Button3Click(Sender: TObject)

procedure Button4Click(Sender: TObject)

procedure Button5Click(Sender: TObject)

procedure Button6Click(Sender: TObject)

procedure Button7Click(Sender: TObject)

private{ Private declarations }

public{ Public declarations }

end

var Form1: TForm1

implementation

{$R *.dfm}

var

F: Text //TextFile 和 Text 是一样的

FileName: string = 'c:\temp\test.txt'

//写文件

procedure TForm1.Button1Click(Sender: TObject)

begin

AssignFile(F,FileName)

Rewrite(F) //会覆盖已存在的文件

Writeln(F, '第一行')

Writeln(F, '第二行')

CloseFile(F)

end

//读文件(先执行写文件)

procedure TForm1.Button2Click(Sender: TObject)

var

s: string

begin

AssignFile(F,FileName)

Reset(F) //只读打开

Readln(F, s) //读取

ShowMessage(s)//显示: 第一行

Readln(F, s) //继脊乎续读取

ShowMessage(s)//显示: 第二行

CloseFile(F)

end

//追加

procedure TForm1.Button3Click(Sender: TObject)

begin

AssignFile(F,FileName)

Append(F) //打开准备追加

Writeln(F, '第三行')

Writeln(F, '第四行')

CloseFile(F)

end

//读取全部(需要Memo帮忙显示)

procedure TForm1.Button4Click(Sender: TObject)

var

s: string

begin

AssignFile(F,FileName)

Reset(F) //只读打开

Memo1.Clear

while not Eof(F) do

begin

Readln(F, s)

Memo1.Lines.Add(s)

end

CloseFile(F)

end

//分列写入

procedure TForm1.Button5Click(Sender: TObject) //这个过程级函数的功能是: 用空格把 s 凑够 n 的长度

function AddSpace(s: stringn: Word): string

begin

while Length(s) <n do

begin

s := s + ' '

end

Result := s

end

var

name: string[8]

address: string[16]

begin

AssignFile(F, FileName)

Rewrite(F)

name := '张三'

name := AddSpace(name,8)

address := '山东泰安'

address := AddSpace(address,16)

Writeln(F, name, address)

name := '李四儿'

name := AddSpace(name,8)

address := '贵州省安顺黄果树'

address := AddSpace(address,16)

Writeln(F, name, address)

name := '王二麻子'

name := AddSpace(name,8)

address := AddSpace(address,16)

Writeln(F, name, address)

CloseFile(F)

{写入的结果是: 张三山东泰安 李四儿 贵州省安顺黄果树 王二麻子北京市海淀区}

end

//分列读取

procedure TForm1.Button6Click(Sender: TObject)

var name: string[8]

address: string[16]

begin

AssignFile(F, FileName)

Reset(F)

Memo1.Clear

while not Eof(F) do

begin

Readln(F, name)

Memo1.Lines.Add(name)

end

CloseFile(F)

Reset(F)

while not Eof(F) do

begin

Readln(F, name, address)

Memo1.Lines.Add(address)

end

CloseFile(F)

{读取结果: 张三 李四儿王二麻子 山东泰安 贵州省安顺黄果树 北京市海淀区}

end

//不同数据类型的写入和读取

procedure TForm1.Button7Click(Sender: TObject)

var name: string[6]

age: Word

birthday: TDate

begin

AssignFile(F,FileName)

Rewrite(F)

name := '菜花 ' //加两个空格凑够6个字符

age := 18

birthday := StrToDate(DateToStr(Now-18*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)

{读取结果: 菜花 18 1989-12-23}

//其实这样的东西应该用类型文件 *** 作更合适, 但如果有这样的文本文件让你读取呢?

end

end.

下面简单地说一下:

1、首先定义一个文件变量。

如果是文本方式:var F: TextFile

如果是二进制方式:var DataFile: file

2、打开文件,先用AssignFile指定团哗文件名,然后用Reset来打开。如:

AssignFile(F, 'test.txt')

Reset(F)

3、文本文件的读写衫丛方法:然后使用Read和Readln读文件。Read相当于VB的Input #,而Readln相当于Line Input #。写文件使用Write和Writeln,相当于Print #语句。

二进制文件的读写方法:然后使用BlockRead读文件。BlockRead相当于VB的Get。塌塌行写文件使用BlockWrite,相当于Put语句。

4、使用CloseFile关闭文件。

{ 方法二:使用内存块进行读写 }

procedure FileCopy(const FromFile, ToFile: string)

var

FromF, ToF: file

NumRead, NumWritten: Word

Buf: array[1..2048] of Char

begin

AssignFile(FromF, FromFile)

Reset(FromF, 1)

AssignFile(ToF, ToFile)

Rewrite(ToF, 1)

repeat

BlockRead(FromF, Buf, SizeOf(Buf), NumRead)

BlockWrite(ToF, Buf, NumRead, NumWritten)

until (NumRead = 0) or (NumWritten <>NumRead)

CloseFile(FromF)

CloseFile(ToF)

end


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存