2017-05-26 56 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/ library/system.io.file.move.aspx)和['Directory.Move'](https://msdn.microsoft.com/en-us/library/system.io.directory.move.aspx)? –

+0

让我读这个。请注意,我有3350个文件 –

+0

您需要多久执行一次?如果只有一次,那应该不是问题。 –

回答

1

快速和肮脏的(但工作)

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); 
       } 
      } 
     } 
    } 
} 

样品使用

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”之一。让它默认为true。在第一次通话中将其设为false,并且不要将其用于递归调用。