递归循环驱动器并替换非法字符

时间:2010-05-18 15:42:32

标签: c# recursion replace

我必须创建一个可以钻入特定驱动器的应用程序,读取所有文件名并用下划线替换非法SharePoint字符。 我所指的非法字符是:~ # % & * {} / \ | : <> ? - ""

有人可以提供代码链接或代码本身如何执行此操作?我对C#非常陌生,需要我能得到的所有帮助。我已经研究了递归钻取驱动器的代码,但我不知道如何将字符替换和递归循环放在一起。请帮忙!

4 个答案:

答案 0 :(得分:6)

删除非法字符的建议如下:

How to remove illegal characters from path and filenames?

您只需将字符集更改为要删除的字符集即可。

如果你已经弄清楚如何递归文件夹,你可以获得每个文件夹中的所有文件:

var files = System.IO.Directory.EnumerateFiles(currentPath);

然后

foreach (string file in files)
{
    System.IO.File.Move(file, ConvertFileName(file));
}

您将编写的ConvertFileName方法接受文件名作为字符串,并返回剥离了坏字符的文件名。

请注意,如果您使用的是.NET 3.5,GetFiles()也可以使用。根据MSDN:

  

EnumerateFiles和GetFiles   方法的不同之处如下:当你   使用EnumerateFiles,你就可以开始了   枚举名称集合   在整个收藏之前   回;当你使用GetFiles时,你   必须等待整个名字   在您可以访问之前返回   数组。因此,当你是   使用许多文件和   目录,EnumerateFiles可以   效率更高。


如何递归列出目录

string path = @"c:\dev";
string searchPattern = "*.*";

string[] dirNameArray = Directory.GetDirectories(path, searchPattern, SearchOption.AllDirectories);

// Or, for better performance:
// (but breaks if you don't have access to a sub directory; see 2nd link below)
IEnumerable<string> dirNameEnumeration = Directory.EnumerateDirectories(path, searchPattern, SearchOption.AllDirectories);

答案 1 :(得分:6)

不是答案,但请考虑以下两点:

以下字符在文件名中无效,因此您无需担心它们:/\:*?"<>|

确保您的算法正确处理重复的名称。例如,My~Project.docMy#Project.doc都会重命名为My_Project.doc

答案 2 :(得分:2)

您想要的重命名文件夹中文件的递归方法。只需将其传递给根文件夹,它就会为找到的所有子文件夹调用自己。

private void SharePointSanitize(string _folder)
{
    // Process files in the directory
    string [] files = Directory.GetFiles(_folder);
    foreach(string fileName in files)
    {
        File.Move(fileName, SharePointRename(fileName));
    }
    string[] folders = Directory.GetDirectories(_folder);
    foreach(string folderName in folders)
    {
        SharePointSanitize(folderName);
    }
}

private string SharePointRename(string _name)
{
    string newName = _name;
    newName = newName.Replace('~', '');
    newName = newName.Replace('#', '');
    newName = newName.Replace('%', '');
    newName = newName.Replace('&', '');
    newName = newName.Replace('*', '');
    newName = newName.Replace('{', '');
    newName = newName.Replace('}', '');
    // .. and so on
    return newName;
}

备注:

  1. 您可以将''方法中的SharePointRename()替换为您要替换的任何字符,例如下划线。
  2. 这不会检查两个文件是否具有相似的名称,如thing~和thing%

答案 3 :(得分:1)

class Program
{
    private static Regex _pattern = new Regex("[~#%&*{}/\\|:<>?\"-]+");
    static void Main(string[] args)
    {
        DirectoryInfo di = new DirectoryInfo("C:\\");
        RecursivelyRenameFilesIn(di);
    }

    public static void RecursivelyRenameFilesIn(DirectoryInfo root)
    {
        foreach (FileInfo fi in root.GetFiles())
            if (_pattern.IsMatch(fi.Name))
                fi.MoveTo(string.Format("{0}\\{1}", fi.Directory.FullName, Regex.Replace(fi.Name, _pattern.ToString(), "_")));

        foreach (DirectoryInfo di in root.GetDirectories())
            RecursivelyRenameFilesIn(di);
    }
}

虽然这不会像史蒂文指出的那样处理重复的名字。