使用RegEx重命名文件夹

时间:2010-07-14 18:47:42

标签: c# regex

请注意:这是一个代码问题而非系统操作。

我的文件夹有SEVERAL下钻(基本上是文件夹内文件夹内的一个文件夹......)。我想知道如果有人知道如何使用RegEx重命名文件夹名称?基本上我需要摆脱〜“#%& *:< > ? / \ {|在任何文件夹名称中。我想知道如何实现这一点,因为我认为我需要从“底部”开始(意味着最后一个可能的钻取文件夹,并开始从最低级别一直到最高级别重命名文件夹)。

有人有什么想法吗?

所以我有以下代码:

 public partial class CleanPathResults : Form
{
    public CleanPathResults()
    {
        InitializeComponent();
    }

    public void Sanitizer(List<string> dirtyPaths)
    {
        string regPattern = (@"[~#&!%+{}]+");
        string replacement = " ";

        Regex regExPattern = new Regex(regPattern);
        Regex regExPattern2 = new Regex(@"\s{2,}");

        StreamWriter errors = new StreamWriter(@"S:\test\Errors.txt", true);


        var dirCount = new Dictionary<string, int>();


        dataGridView1.Rows.Clear();

           try
            {

              foreach (string invalidPaths in dirtyPaths)
              {
                string sanitizedPath = regExPattern.Replace(invalidPaths, replacement);
                  sanitizedPath = regExPattern2.Replace(sanitizedPath, replacement);


                        DataGridViewRow clean = new DataGridViewRow();
                        clean.CreateCells(dataGridView1);
                        clean.Cells[0].Value = invalidPaths;
                        clean.Cells[1].Value = sanitizedPath;

                        dataGridView1.Rows.Add(clean);
                        System.IO.Directory.Move(invalidPaths, sanitizedPath);  




               }
               }

           catch (Exception e)
           {
               throw;
               //errors.Write(e);


           }


    }

我面临的最大问题是这些路径需要从最低级别文件夹重命名为最高级别文件夹,否则我将在调试过程中不断出现错误。

我的问题是如何钻进驱动器,转到树视图中的LOWEST文件夹,向上重命名文件夹? 以路径为例:G:\ Test~ \这只是一个Test \ test&amp; test \ testing !! \ ## test.txt

我怎么能够重命名这个并从测试开始!!文件夹和工作我的方式,以便我没有得到任何错误?

3 个答案:

答案 0 :(得分:0)

您想要DirectoryInfoName财产。获得目录和新名称后,可以使用Directory.Move函数重命名它。

如果要深入查看Directory的子目录,可以在父目录上使用DirectoryInfo.GetDirectories方法,直到返回null或空数组。最简单的方法是通过递归。

此功能允许您向下钻取,从父目录开始:

    private void DrillDown(string folderPath) {
        DirectoryInfo info = new DirectoryInfo(folderPath);

        DirectoryInfo[] directories = info.GetDirectories();
        foreach(DirectoryInfo directory in directories) {
            fixFolder(directory.FullName);
        }
        renameFolder(folderPath);
    }

renameFolder是您重命名文件夹的地方。

答案 1 :(得分:0)

您需要Reverse Breadth First traversal来遍历目录。

答案 2 :(得分:0)

您的代码似乎做得太多了。这是一个只清理目录名称的片段。

static void SanitizeFolders(DirectoryInfo root)
{
    string regPattern = (@"[~#&!%+{}]+");
    string cleanName = "";
    Regex regExPattern = new Regex(regPattern);

    foreach (DirectoryInfo sub in root.GetDirectories())
    {
        if (regExPattern.IsMatch(sub.Name))
        {
            /* set cleanName appropriately... */

            sub.MoveTo(cleanName);
        }
    }

    //recurse into subdirectories
    foreach (DirectoryInfo sub in root.GetDirectories())
    {
        SanitizeFolders(sub);
    }
}