奇怪的EInOutError错误(50分)

  • 主题发起人 主题发起人 SuperJS
  • 开始时间 开始时间
S

SuperJS

Unregistered / Unconfirmed
GUEST, unregistred user!
先请看代码:
FileNum:='000';//string类型
procedure TfrmConfig.AnalyzeLog;
var
mFileName:string;
begin
mFileName:=FilePath+ FileNum +'.log';
self.Loader(mFileName);
end;
procedure TfrmConfig.Loader(mFn: string);
var
F:TextFile;
S:string;
begin
if not FileExists(mFn) then exit;

AssignFile(F,mFn);
Reset(F);//出错处
try
while not eof(F) do
begin
Readln(F, S);
if leftstr(S,1)<>'#' then showmessage(S);
end;
finally
CloseFile(F);
AddFl();
end;
end;

procedure TfrmConfig.AddFl;
var
iTemp:integer;
sTemp:string;
i:integer;
begin
iTemp:= StrToInt(FileNum) + 1;
For i:= 1 To 3-Length(IntToStr(iTemp)) do
begin
sTemp := '0'+sTemp
end;
FileNum := sTemp+IntToStr(iTemp);
Loader(FilePath + FileNum + '.log');
end;

我是从一批有特征的日志文件中提取不以‘#’开头的行然后加以处理,我发现,如果在没有不以‘#’开头的文件中,下次递归调用即AddFl后,到出错处一切正常,但是如果在有不以‘#’开头的文件中,下次递归调用即AddFl后就一定会报EInOutError错误,到底是为什么?是不是我有什么东西没有释放呢?
小弟初学Delphi请多指教!!!
那些文件如:
000.log
001.log
002.log
等!


 
你的嵌套很有问题.现在变成自身循环了,你把嵌套改改再看看.
 
该怎么改呢!
 

finally
CloseFile(F);
AddFl();
end;

中的AddFl()放到其他的地方.

而且在procedure TfrmConfig.AddFl;中不要再调用Loader.
 
如果我一定要递归调用呢!!!!!
 
很奇怪,我试了一下
unit Unit1;

interface

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

type
Tfrmconfig = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
procedure AnalyzeLog;
procedure Loader(mFn: string);
procedure AddFl;
{ Private declarations }
public
{ Public declarations }
end;

var
frmconfig: Tfrmconfig;
FileNum:String;
FilePath:string;//string类型

implementation

{$R *.DFM}
procedure TfrmConfig.AnalyzeLog;
var
mFileName:string;
begin
mFileName:=FilePath+ FileNum +'.log';
self.Loader(mFileName);
end;
procedure TfrmConfig.Loader(mFn: string);
var
F:TextFile;
S:string;
begin
if not FileExists(mFn) then exit;

AssignFile(F,mFn);
Reset(F);//出错处
try
while not eof(F) do
begin
Readln(F, S);
if S[1]<>'#' then showmessage(S);
end;
finally
CloseFile(F);
AddFl();
end;
end;

procedure TfrmConfig.AddFl;
var
iTemp:integer;
sTemp:string;
i:integer;
begin
iTemp:= StrToInt(FileNum) + 1;
For i:= 1 To 3-Length(IntToStr(iTemp)) do
begin
sTemp := '0'+sTemp
end;
FileNum := sTemp+IntToStr(iTemp);
Loader(FilePath + FileNum + '.log');
end;

procedure Tfrmconfig.Button1Click(Sender: TObject);
begin
FileNum:='000';//string类型
FilePath:='E:/Test/';
AnalyzeLog;
end;

end.
没有抛出异常,E:/test下有这几个文件
000.log
001.log
002.log
003.log
每个文件里的值试过这4种
#hello
#hello

hello
#hello

#hello
hello

hello
hello

都没问题,你的为什么会出问题?
是不是其他的原因?






 
发现有一处不同,我用的是leftstr,而zhhc用的是s[],
我去改一下试试!要是真的是这个原因的话,唉......
 
我终于发现了,不是前面说的原因,
是因为有个程序也在对日志文件进行写操作,系统级的,
他的属性并不是只读的。
所以,应该用只读方式打开就可以了,但是我在vb中没
有设置为只读方式也可以打开啊,是不是在用Reset的操
作时,delphi就去抢占权限了,所以失败啊!
我再看看!
 
delphi中有没有可以一行一行读只读文件数据的方法啊,
如果用FileOpen的话,就要自己写解析了!有没有现成的函数啊!
 
还有就是有办法把Integer型的指针转换成TextFile类型的吗?
 
你可以设置FileMode这个全局变量

Indicates the access mode on typed and untyped files opened by the Reset class.

Unit

System

Category

I/O routines

var FileMode: Byte;

Description

The FileMode variable determines the access mode to use when typed and untyped files (not text files) are opened using the Reset procedure.

The default FileMode is 2. Assigning another value to FileMode causes all subsequent Resets to use that mode.

Valid FileMode values are:

0 Read only
1 Write only
2 Read/Write
Warning: FileMode is declared as a variable, not as a threadvar. Therefore this variable is not thread-safe.
 
忘了加例子
AssignFile(F, FileName);
FileMode := 0; {Set file access to read only }
Reset(F);
 
我看了一下那个文件的属性是faArchive,应该和faReadOnly是一个级别的!
谁能告诉我该怎么写啊!
 
zhhc,先感谢你,但是我这样写了,还是报这个错啊,同样如果把log文件
改成我自己建立的就没有问题,到底是为什么啊!!!!
 
我试了一下,如果你那个系统级的程序对log的访问方式为独占方式或禁止其他程序读写的话,
那是怎么也打不开的,用FileOpen也不行
用FileOpen可以的,用Reset也可以。
所以你看能不能对那个系统级的程序做一点修改,让它可以支持共享读写。
至于VB里为什么可以,我也不清楚,会不会是偶然的?
 
faArchive是普通的归档文件,和faReadOnly不是一个级别的

这个不是只读的问题,而是共享的问题,那个文件有可能是被独占打开了,否则的话
Reset自动可以以共享方式打开,不过在Novell上不行。
 
但是如果是独占打开的话,我通过写字板也不应该打不开的啊,
现在是我通过写字板随时可以打开,是在本地机器上的,但是存
盘的话就不行了。
另外,那个系统级的程序不是我写的是微软写的,你总不能让微
软改吧!
还有在vb中我也没有指定文件访问形式,就可以和访问正常文件
一样访问了。是不是微软在里面搞了什么鬼啊!
 
我这样试了一下,可以打开正在运行的explorer.exe,
你试试把FileMode的值设成fmShareDenyNone+fmOpenRead,应该就行了

AssignFile(F,'c:/windows/explorer.exe');
FileMode:=fmShareDenyNone+fmOpenRead;//表示共享读取
Reset(F);//出错处
CloseFile(F);
 
FileMode好象没能等于fmShareDenyNone+fmOpenRead;
这是用于FileOpen或是TFileStream的
 
两位的热情参与我很感动,但是这个问题还是没有解决,
我用fileopen的方法加fmShareDenyNone+fmOpenRead,可
以打开了,我看了一下,不太会用,如果要读文本的话好相比较烦!
唉!
另外我用的是2000,用delphi6自带的一个FileOpen的例子时会报无法
读取内存中的值,唉,好烦啊!
不要告诉我改回去用vb噢!
其实,相关的vb程序我已经完成了,我想用delphi再写一个提高一下性
能,并让他商业化,唉,烦,烦,烦!
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
964
import
I
I
回复
0
查看
672
import
I
I
回复
0
查看
820
import
I
后退
顶部