我有一个“清理”“脏”文件名的应用。 “脏”文件名的文件名中包含#%&〜+ {}。我的应用程序所做的是查看它们是否与我定义的RegEx模式匹配,然后将其发送到名为FileCleanUp的方法,在该方法中它“清理”文件并用“”替换无效字符。但是,当我运行它时,我注意到我的FileCleanup方法仅适用于某些文件,而不适用于其他文件!
这是我的代码:
public class SanitizeFileNames
{
public void FileCleanup(List<string>paths)
{
string regPattern = (@"[~#&!%+{}]+");
string replacement = "";
Regex regExPattern = new Regex(regPattern);
foreach (string files2 in paths)
try
{
string filenameOnly = Path.GetFileName(files2);
string pathOnly = Path.GetDirectoryName(files2);
string sanitizedFileName = regExPattern.Replace(filenameOnly, replacement);
string sanitized = Path.Combine(pathOnly, sanitizedFileName);
//write to streamwriter
System.IO.File.Move(files2, sanitized);
}
catch (Exception e)
{
//write to streamwriter
}
}
我在一些文件上测试过如下名称:~Test.txt,#Test.txt,+ Text.txt,Test&amp; Test.txt,T {e} st.txt,Test%.txt。
我无法重命名的是:~Test.txt,+ Test.txt,T {e} st.txt
我调试了这个并且非常奇怪,它表明这些文件在调试器上由于某种原因没有重命名。它不是将~Test.txt显示为“已清理”的文件名,而是Text.txt。所以在应用程序方面,它正确地读取了我的foreach循环。
然而,我真的很难过为什么它实际上没有重命名这些文件。任何人都知道为什么会这样?它与File.Move()有关吗?
编辑:在进一步测试时,我意识到它也没有重命名这样的文件:~~ test.txt或## test.txt
答案 0 :(得分:1)
你有一个空的catch块。为什么不打印出异常消息以查看发生了什么?
我的猜测是文件名与正则表达式匹配,但您无法重命名文件,因为在Test.txt
重命名为#Test.txt
后,名为~Test2.txt
的文件已经存在。在再次运行程序之前,尝试将其他文件重命名为+Test3.txt
,T{e}st4.txt
,{{1}}。