如何遍历一个目录,并将目录下的无扩展名的文件改为.txt文件(如:sys 就改为 sys.txt) (50分)

  • 主题发起人 主题发起人 美国提子
  • 开始时间 开始时间

美国提子

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TForm1.FindAll(const Path: String);
var
sr:TSearchRec;
fr:Integer;
f: File;
begin
fr:=FindFirst(Path,faAnyFile,sr);
while fr=0 do
begin
if (sr.Attr=faDirectory)and(sr.Name<>'.')and(sr.Name<>'..') then
FindAll(sr.Name)
else begin
if Pos('.',sr.Name) = 0 then//到不了这一步啊
begin
AssignFile(f,sr.Name);
ReName(f,sr.Name+'.txt');
end;
end;
FindNext(sr);
end;
FindClose(sr);
end;


procedure TForm1.Button1Click(Sender: TObject);
var
PathStr: String;
begin
PathStr := DLB.Directory;//DLB是TDirectoryListBox
FindAll(PathStr);
end;
上面好像不行啊,一运行就死机
 
以下代码在Win2000+D5下运行通过:
procedure TForm.Button1Click(Sender: TObject);
var
slTmp : Tstrings;
i : integer;
sDir : string;
begin
sDir := 'C:/XXX';
slTmp := TStringList.Create;
FilenamesToStrings(sDir, '*.', slTmp, 0);
// showmessage(slTmp.Text);
for i := 0 to slTmp.Count - 1 do
RenameFile(slTmp, slTmp + '.txt');
slTmp.Free;
end;

procedure TForm.FilenamesToStrings(FromDir, FileExt: string; var
FileNameStrings: tstrings; Attr: integer);
{例:得到目录中*.bmp的文件}
var
Found : integer;
SearchRec : TSearchRec;
sTDir : string;
begin
if FileNameStrings = nil then exit;
sTDir := NormalDir(FromDir);
Found := FindFirst(sTDir + FileExt, Attr, SearchRec);
while Found = 0 do
begin
if (SearchRec.Name <> '.') and
(SearchRec.Name <> '..') then
FileNameStrings.Add(sTDir + SearchRec.Name);
Found := FindNext(SearchRec);
end;
SysUtils.FindClose(SearchRec);
// FindClose(SearchRec);
end;
 
[Error] Unit1.pas(36): Undeclared identifier: 'NormalDir'
 
抱歉,忘了把这个函数贴上去:)
function TForm.NormalDir(const DirName: string): string;
{路径加/}
begin
Result := DirName;
if (Result <> '') and
{$IFDEF RX_D3}
not (AnsiLastChar(Result)^ in [':', '/']) then
{$ELSE}
not (Result[Length(Result)] in [':', '/']) then
{$ENDIF}
begin
if (Length(Result) = 1) and (UpCase(Result[1]) in ['A'..'Z']) then
Result := Result + ':/'
else Result := Result + '/';
end;
end;
 
给个简单的方法。
生成一个FileListBox,赋Directory值。
用一个FileListBox把目录下的文件显示出来,循环判断每个Item,
没有扩展名按条件处理就行了。
嘿嘿,你老兄的个人说明档也说了:为达目的,不择手段,除非你在练技术。
 
nnd,实在看不下去了,

to 美国提子 :你写的是死循环!
 
修改你的源代码如下:我只是显示各个文件名,改名的事儿还得你来做。
你只是在使用FIND时,没有给路径加上“/*.*”.
procedure TForm1.FindAll(const Path: String);
var
sr:TSearchRec;
fr:Integer;
begin
fr:=FindFirst(Path,faAnyFile,sr);
while fr=0 do
begin
if (sr.Attr=faDirectory)and(sr.Name<>'.')and(sr.Name<>'..') then
FindAll(sr.name+'/*.*') //递归查找下一个目录
else
begin
//处理文件
showmessage(sr.name);
end;
fr:=FindNext(sr);
end;
FindClose(sr);
end;



procedure TForm1.Button1Click(Sender: TObject);
var
PathStr: String;
begin
PathStr := DLB.Directory+'/*.*';//DLB是TDirectoryListBox
FindAll(PathStr);
end;
 
以上方法有一个缺点就是在根目录下查不出来.再次修改源码如下:
procedure TForm1.Button1Click(Sender: TObject);
var
PathStr: String;
begin
if length(DLB.Directory) <> 3 then
PathStr := DLB.Directory+'/*.*' //DLB是TDirectoryListBox
else
PathStr := DLB.Directory+'*.*';
FindAll(PathStr);
end;
 
to Activer
你个鸟人,看不下去了也不说说如何改
to kingdeezj
呵呵,好像也是死循环啊。

to 各位
哎,分数太少了
 
呵呵,我这儿可以通过,到你那儿就成了死循环了,不会吧你那儿太黑了,也。。。
我的代码比你多了一个
FR:=FINDNEXT(SR)
 
呵呵,对了,我没加
 
后退
顶部