我有这段代码:
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);
}
现在,我的问题是,我如何确保在.Replace()之前,应用程序首先检查文件名是否不存在?
我注意到我的应用程序,当给出这些测试文件时:### test.txt,#~test.txt不会删除无效的字符,因为重命名后,它们都具有相同的文件名(test.txt)。
如果是的话,我希望它转到另一个foreach循环,我将无效的char切换到特定的char(而不是空白)。代码真的会有所帮助。
谢谢!
答案 0 :(得分:2)
您可以使用File.Exists
检查文件是否已存在。这是参考:
http://msdn.microsoft.com/en-us/library/system.io.file.exists.aspx
所以在你的例子中:
string sanitized = Path.Combine(pathOnly, sanitizedFileName);
if (!System.IO.File.Exists(sanitized))
{
// perform the move
System.IO.File.Move(files2, sanitized);
}
else
{
// perform other action
}
正如ChrisF在您的问题的评论部分中提到的那样,您可以使用Path.GetInvalidFileNameChars
和Path.GetInvalidPathChars
来确保文件名有效。
答案 1 :(得分:1)
if (System.IO.File.Exists(sanitized))
{
// The file already exists!
}
答案 2 :(得分:0)
int replacement = 0;
while( File.Exists( sanitized ) )
{
int lastDot = sanitized.LastIndexOf('.');
if( lastDot < 0 )
lastDot=sanitized.Length;
sanitized = String.Format("{0}{1}{2}",
sanitized.Substring(0,lastDot - (replacement>0?1:0)),
replacement++,
sanitized.Substring(lastDot)
);
}