【发布时间】:2026-01-04 19:30:01
【问题描述】:
我有一个“清理”“脏”文件名的应用程序。 “脏”文件名的文件名中有 #%&~+{}。我的应用程序所做的是查看它们是否与我定义的 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&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
【问题讨论】: