文件夹批量改名,代码如下:procedure TForm1.Button1Click(Sender: TObject);
var
  sr : TSearchRec;
const
  s = 'c:\gyj\'; //把所有要改名的都放在这个文件夹下,根据你的情况修改。
begin
  if DirectoryExists(s) then
  begin
    if FindFirst(s+'*.*', faDirectory , sr) = 0 then
    begin
      repeat
        if (sr.Attr and faDirectory ) = sr.Attr then
        begin
          if (sr.Name<>'.') and (sr.Name<>'..') then
          begin
            //FileSetAttr(s+sr.Name,faArchive);
            RenameFile(s+sr.Name,s+'SH-'+ sr.Name );
          end;
        end;
      until FindNext(sr) <> 0
    end;
    FindClose(sr);
  end;
end;我在c:\gyj\文件夹下放两个文件夹22-85、22-86,结果没有问题,正常修改成SH-22-85、SH-22-86但是放两个文件夹22-85A、22-86A,结果是SH-SH-22-85A、SH-SH-22-86A,设置断点,单步调试,发现FindNext把没有改名以前的文件夹遍历后,又重新遍历RenameFile后的文件夹,谁能解释这两种情况有什么区别,先谢谢!先给100,分不够再加。

解决方案 »

  1.   

    to  BorIand(Delphi):我有四个版本的蒙料,没有找到,给个搜索关键子。其它的实现方法也可以,我就觉得奇怪为什么这个程序文件夹名字不同,RenameFile后FindNext的结果怎么不一样,程序哪里有问题?
      

  2.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      sr : TSearchRec;
    const
      s = 'D:\EBook\1\'; //把所有要改名的都放在这个文件夹下,根据你的情况修改。
    begin
      if DirectoryExists(s) then
      begin
        if FindFirst(s+'*.*', faDirectory , sr) = 0 then
        begin
          repeat
            if (sr.Attr and faDirectory ) = sr.Attr then
            begin
              if (sr.Name<>'.') and (sr.Name<>'..') then
              begin
                FileSetAttr(s+sr.Name,faArchive);  //-----
                RenameFile(s+sr.Name,s+'SH-'+ sr.Name );
              end;
            end;
          until FindNext(sr) <> 0
        end;
        FindClose(sr);
      end;
    end;
      

  3.   

    按照 Sorder(剑客)的方法,这下可以,不过我不明白原来的错误原因。
    procedure TForm1.Button1Click(Sender: TObject);
    var
      sr : TSearchRec;
      ts : TStringList;
      i : Integer;
    const
      s = 'c:\gyj\'; //把所有要改名的都放在这个文件夹下,根据你的情况修改。
    begin
      if DirectoryExists(s) then
      begin
        ts := TStringList.Create;
        try
          if FindFirst(s+'*.*', faDirectory , sr) = 0 then
          begin
            repeat
              if (sr.Attr and faDirectory ) = sr.Attr then
              begin
                if (sr.Name<>'.') and (sr.Name<>'..') then
                  ts.Add(sr.Name);
              end;
            until FindNext(sr) <> 0
          end;
          FindClose(sr);      if ts.Count > 0 then
            for i := 0 to ts.Count - 1 do
              if DirectoryExists(s+ts.Strings[i]) then
                RenameFile(s+ts.Strings[i],s+'SH-'+ts.Strings[i]);
        finally
          ts.Free;
        end;
      end;
    end;
      

  4.   

    to meiqingsong(阿飛):把文件的属性改成faArchive,FindNext自然就找不到。
      

  5.   

    我做过测试。先建目录,然后调用上面的代码,没有问题,但是文件夹名是22-86A这样的一个有问题
    procedure TForm1.Button2Click(Sender: TObject);
    var
      i:Integer;
    begin
      for i := 1 to 10000 do
        ForceDirectories('C:\gyj\' + IntToStr(i));
    end;