2017-05-26 20 views
0
私のアプリケーションは、私は次のように変更して、ディレクトリ構造の名前を変更する方法を探しています

一致する文字列でFolderNamesやファイル名の名前を変更する方法を再帰的

FolderMatchALeve1 
-FileMatchALevel2_A.cs 
-FileMatchALevel2_B.cs 
-FolderMatchALevel2 
--FileMatchALevel3_A.txt 
--FileMatchALevel3_B.txt 

次のディレクトリ構造内のファイルを生成し

- 「抹茶を変更"~" AMatch "

だから、結果は、プログラムを実行した後、そのようになります。

FolderAMatchLeve1 
-FileAMatchLevel2_A.cs 
-FileAMatchLevel2_B.cs 
-FolderAMatchLevel2 
--FileAMatchLevel3_A.txt 
--FileAMatchLevel3_B.txt 

をこれまでのところ解決策を見つけるために私の探求では、私は成功していません。これに対する解決策を見つけるのを手伝ってください。

私は、このソリューションをC#Winformsで必要としています。これは、当社のレガシー製品を維持するためです。

編集:

追加情報

  1. 私は毎回誰かが我々のプログラムを実行し、この変更を行う必要があります。

  2. は、私が3350個のファイル

    にこれを行う必要があり

質問のまとめ:要するに

、再帰的(または反復して)各ディレクトリを通過しながら、私はそれがそのファイルの名前を変更したいです名前が一致する文字列と一致し、その後に出てきたときに、文字列に一致する名前があれば(名前の部分一致または完全一致の場合)、ディレクトリの名前を変更します。

+1

[ 'File.Move']についての何(https://msdn.microsoft.com/en-us/ライブラリ/ system.io.file.move.aspx)と['Directory.Move'](https://msdn.microsoft.com/en-us/library/system.io.directory.move.aspx)? –

+0

これを読ませてください。 3350個のファイルがあることに注意してください。 –

+0

どのくらいの頻度でこれを行う必要がありますか?一度だけあれば、それは問題ではありません。 –

答えて

1

クイックとダーティ(しかし作業)

class Program 
{ 
    static void Main(string[] args) 
    { 
     DirectoryRenamer.RenameDirectoryTree( 
      @"C:\Test\FolderMatchALevel", 
      name => name.Replace("MatchA", "AMatch")); 
    } 
} 
+0

これは本当に良いです。 3つのフォルダのうち2つで動作しました。新鮮な起動後にプログラムを実行していても、別のプロセスで使用されているというエラーが表示されます。 –

+0

どちらが...私はあなたがパス引数で渡すフォルダを推測します。そのパス上のアプリケーションの現在のディレクトリがあるときは常にロックされます。あなたのアプリケーションがそこにあると思われます –

+0

私が根本的に問題を引き起こしたときに私は書き返します。しかし私の場合、それは最も重要な部分を置き換えています。 Rufoさん、ありがとうございます。 –

1

ワイルドカードを使用して、私は一度、基本的な移動コマンドを使用していくつかのファイルのファイルの終わりを変更することができました。しかし、これらの変更はそれをはるかに超えている可能性があります。

しかし、これは全体的に、Directoryクラスまたは他のクラスのいずれかを使用するフォルダに対する単純な再帰です。 擬似コードは次のようになります。

  1. 現在のディレクトリにあるすべてのディレクトリをリストします。
  2. 再帰的にこのディレクトリの名前を変更し、このディレクトリ内のすべてのファイル
  3. を反復
  4. すべてのサブディレクトリのためにもう一度この関数を呼び出します。

名前を変更するための「正しい」方法はmoveコマンドです。実際、同じディスク上での移動と名前の変更には技術的な違いはありません。

Nrを入力することもできます。ブールスイッチ上の4。パラメータ "DirectoryRename"に名前を付けます。それを真とする。最初の呼び出しではfalseを渡し、再帰呼び出しには使用しないでください。

public static class DirectoryRenamer 
{ 
    public static void RenameDirectoryTree(string path, Func<string, string> renamingRule) 
    { 
     var di = new DirectoryInfo(path); 
     RenameDirectoryTree(di, renamingRule); 
    } 

    public static void RenameDirectoryTree(DirectoryInfo directory, Func<string, string> renamingRule) 
    { 
     InternalRenameDirectoryTree(directory, renamingRule); 

     var currentName = directory.Name; 
     var newName = renamingRule(currentName); 
     if (currentName != newName) 
     { 
      var newDirname = Path.Combine(directory.Parent.FullName, newName); 
      directory.MoveTo(newDirname); 
     } 
    } 

    static void InternalRenameDirectoryTree(DirectoryInfo di, Func<string, string> renamingRule) 
    { 
     foreach (var item in di.GetFileSystemInfos()) 
     { 
      var subdir = item as DirectoryInfo; 
      if (subdir != null) 
      { 
       InternalRenameDirectoryTree(subdir, renamingRule); 

       var currentName = subdir.Name; 
       var newName = renamingRule(currentName); 
       if (currentName != newName) 
       { 
        var newDirname = Path.Combine(subdir.Parent.FullName, newName); 
        subdir.MoveTo(newDirname); 
       } 
      } 

      var file = item as FileInfo; 
      if (file != null) 
      { 
       var currentName = Path.GetFileNameWithoutExtension(file.Name); 
       var newName = renamingRule(currentName); 
       if (currentName != newName) 
       { 
        var newFilename = Path.Combine(file.DirectoryName, newName + file.Extension); 
        file.MoveTo(newFilename); 
       } 
      } 
     } 
    } 
} 

使用例

関連する問題