关于查询文件夹里文件的问题。 ( 积分: 100 )

  • 主题发起人 主题发起人 天空之鹰
  • 开始时间 开始时间

天空之鹰

Unregistered / Unconfirmed
GUEST, unregistred user!
我写一个文件改名程序,文件一共分2类,I开头的,S开头的,这两类文件是一一对应的,也就是有I....就必须有S....(....是相同的,比如有I050101.02就应该有S050101.02);这个程序是批量改名的,也就是好多I、S文件一起改,但在改名之前我想检查一下I和S文件是不是一一对应,也就是文件完不完整,
有什么好方法?我先说说我的方法:
var//全局变量
a,b:string;
i:integer;
procedure TForm1.Button1Click(Sender: TObject);//在列表filelistbox2中列出以I开头或以S开头的文件名(取数量多的类型)
var
Attr:integer;
found:Boolean;
searchrec:Tsearchrec;

begin
filelistbox2.Clear;
b:=directorylistbox1.Directory;
a:=b+'/';
if FindFirst(a+'I05*.*',faAnyFile, SearchRec) = 0 then
begin
repeat
filelistbox2.items.Add(SearchRec.Name);
until (FindNext(SearchRec) <> 0);
end;
FindClose(SearchRec);
end;
end;
procedure TForm1.Button2Click(Sender: TObject);//检测
var
v1,v2,vt,vs:string;
begin
b:=directorylistbox1.Directory;//文件夹路径
//在列表中列出以I开头或以S开头的文件名(取数量多的类型)
for i:=0 to filelistbox2.items.count-1 do//循环复制出文件名后面几位字符串
if filelistbox2.selected then
begin
vs:=filelistbox2.items;
v1:=copy(vs,2,7);
v2:=copy(vs,9,10);
vt:=Concat(v1,v2);
if
fileexists(b+'/'+'s'+vt)=false then//用查找函数查出文件夹中是否存在以S开头或I开头的文件
edit1.text:='no'//没有
else
edit1.text:='yes';//有
end;

这样有问题,我发现用fileexists函数检测时只检测列表最后一个文件是否存在,别的文件它都不检测。是不是fileexists函数不能动态查找?它的条件中不能有变量么?那怎么办,我目的是按下检测按钮就能查到每一个I开头的文件是否有一个S开头的文件和他共存。
 
我写一个文件改名程序,文件一共分2类,I开头的,S开头的,这两类文件是一一对应的,也就是有I....就必须有S....(....是相同的,比如有I050101.02就应该有S050101.02);这个程序是批量改名的,也就是好多I、S文件一起改,但在改名之前我想检查一下I和S文件是不是一一对应,也就是文件完不完整,
有什么好方法?我先说说我的方法:
var//全局变量
a,b:string;
i:integer;
procedure TForm1.Button1Click(Sender: TObject);//在列表filelistbox2中列出以I开头或以S开头的文件名(取数量多的类型)
var
Attr:integer;
found:Boolean;
searchrec:Tsearchrec;

begin
filelistbox2.Clear;
b:=directorylistbox1.Directory;
a:=b+'/';
if FindFirst(a+'I05*.*',faAnyFile, SearchRec) = 0 then
begin
repeat
filelistbox2.items.Add(SearchRec.Name);
until (FindNext(SearchRec) <> 0);
end;
FindClose(SearchRec);
end;
end;
procedure TForm1.Button2Click(Sender: TObject);//检测
var
v1,v2,vt,vs:string;
begin
b:=directorylistbox1.Directory;//文件夹路径
//在列表中列出以I开头或以S开头的文件名(取数量多的类型)
for i:=0 to filelistbox2.items.count-1 do//循环复制出文件名后面几位字符串
if filelistbox2.selected then
begin
vs:=filelistbox2.items;
v1:=copy(vs,2,7);
v2:=copy(vs,9,10);
vt:=Concat(v1,v2);
if
fileexists(b+'/'+'s'+vt)=false then//用查找函数查出文件夹中是否存在以S开头或I开头的文件
edit1.text:='no'//没有
else
edit1.text:='yes';//有
end;

这样有问题,我发现用fileexists函数检测时只检测列表最后一个文件是否存在,别的文件它都不检测。是不是fileexists函数不能动态查找?它的条件中不能有变量么?那怎么办,我目的是按下检测按钮就能查到每一个I开头的文件是否有一个S开头的文件和他共存。
 
if filelistbox2.selected then 这句有必要么?难道要判断选中的文件存在?要真是那样您的filelistbox索引也应该跟着下移呀
 
FileExists函数只适合于全名查询.不能用于模糊查询.
 
你可以利用循环,查到每一个I开头的文件,再用S代替I,最后用FileExists查找
是否存在这个以S开头的文件。用以下这个循环就行阿:
if FindFirst(a+'I05*.*',faAnyFile, SearchRec) = 0 then
begin
repeat
str:=SearchRec.Name;
str:='S'+Copy(str,2,Length(str)-1);
if FileExists(b+str) then
showmessage('yes')
else
showmessage('no');
until (FindNext(SearchRec) <> 0);
end;
FindClose(SearchRec);
end;
 
if filelistbox2.selected then 确实是我加错了,多余的代码;
missinwind兄这样做,还是有两点缺点:
1、到最后用FileExists检测时,也是一个一个文件的教验,
重复出现showmessage('yes')或showmessage('no');我这的文件如果有几十个上百个,就要重复按几十次上百次,看来FileExists还是不能执行连续教验,就是当遇到不对应的文件时给出提示,如果都对应,校验整个文件夹之后给出提示。
2、如果我的以I开头的文件少于S开头的文件,那么虽然不是一一对应,但是提示信息还是
showmessage('yes'),我觉得应该先比较一下I和S的数量的多少,用FindFirst查找数量多的I或S,这个怎么办哪?麻烦各位给想想办法。
 
换一种方法
用二进制打开文件或者用文件流打开文件,判断文件的长度为0或者打开文件错误就是不存在,速度也不慢,我试过了几百个文件速度用肉眼分辨不出来。
 
funxu兄,不懂你所说的,能不能说的详细些呀?
 
看看这个
var
FileHandle : Integer;
begin
FileHandle := FileOpen(FileName,fmOpenRead);
if FileHandle > 0 then
//该文件不存在
else
//该文件存在
fileclose(FileHandle);
用其他的打开文件的方法也可以,如果你的文件不是很多,这个方法比FileExists慢不到哪里
 
其时我认为你不需要一个个用fileexists判断文件是否存在的,你能用一个filelistbox将所有'I05*.*'开头的文件装载进去,那么为什么不能用同样的方法将所有'S05*.*'开头的文件也装载到另一个filelistbox中去呢,这样的话,你就直接在这两个filelistbox中判断并取出已经装载的文件符合你条件的文件名再操作它,不是更方便且快捷些吗???
 
后退
顶部