Below is a simple method for fixing bad filenames and paths. This uses the character lists from Path.GetInvalidPathChars and Path.GetInvalidFileNameChars (part of System.IO).
You should be able to pass a filename, directory or path. Example, calling these three lines would yield the below:
cleanPath(@"c:\tem|<p\fi<>le.txt") cleanPath(@"c:\tem|<p\") cleanPath(@"fi<le.txt")
Returns:
c:\tem-p\fi-le.txt c:\tem-p\ fi-le.txt
You can also pass a string that’s used to replace the bad characters.
cleanPath(@"c:\tem|<p\fi<>le.txt", string.Empty)
Returns:
c:\temp\file.txt
private string cleanPath(string toCleanPath, string replaceWith = "-") { //get just the filename - can't use Path.GetFileName since the path might be bad! string[] pathParts = toCleanPath.Split(new char[] { '\\' }); string newFileName = pathParts[pathParts.Length - 1]; //get just the path string newPath = toCleanPath.Substring(0, toCleanPath.Length - newFileName.Length); //clean bad path chars foreach (char badChar in Path.GetInvalidPathChars()) { newPath = newPath.Replace(badChar.ToString(), replaceWith); } //clean bad filename chars foreach (char badChar in Path.GetInvalidFileNameChars()) { newFileName = newFileName.Replace(badChar.ToString(), replaceWith); } //remove duplicate "replaceWith" characters. ie: change "test-----file.txt" to "test-file.txt" if (string.IsNullOrWhiteSpace(replaceWith) == false) { newPath = newPath.Replace(replaceWith.ToString() + replaceWith.ToString(), replaceWith.ToString()); newFileName = newFileName.Replace(replaceWith.ToString() + replaceWith.ToString(), replaceWith.ToString()); } //return new, clean path: return newPath + newFileName; }
Hope it helps!