2012-01-13 8 views
0

私はあるフォルダに数百のサブディレクトリを持ち、サブディレクトリには何百ものサブフォルダがあります。私は、サブフォルダ名として「(番号)」を接頭辞にしたい、サブフォルダはそれが含まれている場合は、サブフォルダ名は、「(番号)」を含めるかどうかを確認したい:たとえば:delphiのバッチサブディレクトリの名前を変更する方法は?

rootfolder 
     --- subfolder1 
       ---subfolder11(100082) 
         --- file1.txt 
     --- subfolder2(100083) 
        ---subfolder22(100085) 
         --- file2.txt 
         --- subfolder222 
            ---subfolder2222(80001) 
                 ---file3.txt 

私が持っていると思います。

rootfolder 
     --- subfolder1 
       ---(100082)subfolder11 
         --- file1.txt 
     --- (100083)subfolder2 
        ---(100085)subfolder22 
         --- file2.txt 
         --- subfolder222 
            --- (80001)subfolder2222 
                 --- file3.txt 

私を助けてくれますか? ありがとうございます。

+3

? –

+0

どのバージョンのDelphiですか? – RobertFrank

答えて

2

は、あなたのニーズに合わせてカスタマイズ、サブディレクトリの名前を変更したコードです:あなたがで立ち往生している

procedure ProcessDir(const DirName: string); 
var 
    Path, NextDir: string; 
    F: TSearchRec; 

begin 
    Path:= DirName + '/*.*'; 
    if FindFirst(Path, faAnyFile, F) = 0 then begin 
    try 
     repeat 
     if (F.Attr and faDirectory <> 0) then begin 
      if (F.Name <> '.') and (F.Name <> '..') then begin 
      NextDir:= DirName + '/' + F.Name; 
      ProcessDir(NextDir); 
// generate new folder name here, next line just for testing 
      RenameFile(NextDir, NextDir + '_Renamed'); 
      end; 
     end; 
     until FindNext(F) <> 0; 
    finally 
     FindClose(F); 
    end; 
    end; 
end; 
+0

ありがとうございます。それはうまく動作し、容易に理解されます。私はもともとサブフォルダを反復し、上から下に間違って名前を変更する方法に悩まされていました。 – Warren

1

すべてのフォルダを見つけるには、再帰的なディレクトリ検索が必要です。ボトムアップから名前を変更します。

+0

'FindFirst' /' FindNext'を使うと、ボトムアップやトップダウンの名前を変更するかどうかは重要ですか? –

+1

@DavidHeffernan - これを試していない(またはそれについて深く考えた)が、再帰中に無効なパスを生成するトップダウンから名前を変更すると思われる? –

+0

@Martinそれは 'FindFirst' /' FindNext'がどのように動作するかによって異なります。反復処理中に名前が変更されたオブジェクトに対して復元力があるように実装できます。実際にはそうでなければ実装されていないと、あまり役に立たなくなるでしょう。 –

3

まあ、一例として、これはフォルダツリーに嫌なことをして、私の抽出物である - それは彼らの名前は変更されません、それはそれらを破壊する:

procedure splatDirectory(const dirSpec:string); 
var searchRec:TsearchRec; 
    searchResult:integer; 
begin 
    searchResult:=findFirst(dirSpec+'\*.*',faDirectory,searchRec); 
    try 
    while (0=searchResult) do 
    begin 
     if ((searchRec.attr and faDirectory)>0) then 
     begin 
     if (searchRec.name<>'.') and (searchRec.name<>'..') then 
      splatDirectory(dirSpec+'\'+searchRec.Name) 
     end 
     else 
     deleteFile(dirSpec+'\'+searchRec.Name); 
     searchResult:=findNext(searchRec); 
    end; 
    finally 
    findClose(searchRec); 
    end; 
    removeDir(dirSpec); 
end; 

このない作品 - コードを作業からコピー。ここで

+0

..そしてそれは 'bottom-up'です。removeDir()はexitの直前に呼び出されているので、どのブランチの最下位フォルダも最初に削除されます。ちょうどこれを「名前の変更」と置き換え、「普通の」ファイルを削除するコードを削除すると... –

+1

+1の奇数の下線を言います。多分、誰かがヨーダの条件を好きではなかったでしょう! –

+0

* while(0 = searchResult)*、それは何ですか?キャメルケース?あなたはCで何かを書きましたか? – OnTheFly

関連する問題