我必须创建一个可以钻入特定驱动器的应用程序,读取所有文件名并用下划线替换非法SharePoint字符。
我所指的非法字符是:~ # % & * {} / \ | : <> ? - ""
有人可以提供代码链接或代码本身如何执行此操作?我对C#非常陌生,需要我能得到的所有帮助。我已经研究了递归钻取驱动器的代码,但我不知道如何将字符替换和递归循环放在一起。请帮忙!
答案 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.doc
和My#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;
}
备注:强>
''
方法中的SharePointRename()
替换为您要替换的任何字符,例如下划线。答案 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);
}
}
虽然这不会像史蒂文指出的那样处理重复的名字。