在替换无效的char之前检查文件名是否已经存在

时间:2010-06-29 19:51:11

标签: c#

我有这段代码:

   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(而不是空白)。代码真的会有所帮助。

谢谢!

3 个答案:

答案 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.GetInvalidFileNameCharsPath.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)
        );
}