C# 重命名与我的正则表达式匹配的文件时遇到问题
我有一个“清理”“脏”文件名的应用程序。“脏”文件名的文件名中有#%&~+{}。我的应用程序所做的是查看它们是否与我定义的正则表达式模式匹配,然后将其发送到名为FileCleanUp的方法,在该方法中它“清理”文件并用“”替换无效字符。然而,当我运行这个程序时,我注意到我的FileCleanup方法只对一些文件有效,而对其他文件无效 这是我的密码:C# 重命名与我的正则表达式匹配的文件时遇到问题,c#,regex,C#,Regex,我有一个“清理”“脏”文件名的应用程序。“脏”文件名的文件名中有#%&~+{}。我的应用程序所做的是查看它们是否与我定义的正则表达式模式匹配,然后将其发送到名为FileCleanUp的方法,在该方法中它“清理”文件并用“”替换无效字符。然而,当我运行这个程序时,我注意到我的FileCleanup方法只对一些文件有效,而对其他文件无效 这是我的密码: public class SanitizeFileNames { public void FileCleanup(List<
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
}
}
public-class-SanitizeFileNames
{
公共无效文件清理(列表路径)
{
字符串regPattern=(@“[~#&!%+{}]+”;
字符串替换=”;
Regex regexpatern=新的Regex(regPattern);
foreach(路径中的字符串文件2)
尝试
{
字符串filenameOnly=Path.GetFileName(files2);
字符串pathyly=Path.GetDirectoryName(files2);
字符串sanitizedFileName=regexpatern.Replace(仅限文件名,replacement);
string sanitized=Path.Combine(仅限pathOnly,sanitizedFileName);
//写给streamwriter
System.IO.File.Move(files2,已消毒);
}
捕获(例外e)
{
//写给streamwriter
}
}
我测试了几个名为:~Test.txt、#Test.txt、+Text.txt、Test&Test.txt、T{e}st.txt、Test%.txt的文件
我无法重命名的是:~Test.txt、+Test.txt、T{e}st.txt
我对此进行了调试,奇怪的是,它显示由于某种原因未重命名的这些文件在调试器上是正确的。它没有将~Test.txt显示为“净化”文件名,而是显示为Text.txt。因此在应用程序端,它确实正确读取了我的foreach循环
然而,我真的很困惑,为什么它实际上没有重命名这些文件。有人知道为什么会这样吗?这与文件.Move()有关吗
编辑:在进一步的测试中,我意识到它也不会重命名如下文件:~~test.txt或##test.txt您有一个空的catch块。为什么不打印异常消息以查看发生了什么
我的猜测是,文件名与正则表达式匹配,但您无法重命名文件,因为在将
#Test.txt
重命名为该文件后,名为Test.txt
的文件已经存在。请尝试将其他文件重命名为~Test2.txt
,+Test3.txt
,T{e}st4.txt
再次运行程序之前。哈!我甚至没想到这有多简单:)非常感谢你,先生!@yeahumok:很高兴能提供帮助。避免这样命名冲突的一种方法是替换%&+{}
使用不同的有效字符,而不是仅仅删除它。你知道我如何捕捉到这样一个事实,即一个文件不能被重命名为已存在于Catch块文件夹中的重复文件的b/c吗?我是c#新手,错误记录对我来说也是一个新概念。@yeahumok:你必须看看到底发生了什么异常hrown。我可能会在到达catch块之前处理它,在写入流之前检查sanitizedFileName
是否已经存在。