The characters that are not allowed in a file name are available from the Path.GetInvalidFileNameChars() method (but note the "Remarks" section in the documentation). For the reserved file names, I'm not aware of a method to get them, so you would have to compare against all of them explicitely:
bool IsValidFileName(string name)
{
// empty names are not allowed
if (string.IsNullOrEmpty(name))
return false;
// check for characters that are not allowed in a file name
if (Path.GetInvalidFileNameChars().Any(c => name.Contains(c))
return false;
// check for reserved names
if (name.Equals(".", StringComparison.OrdinalIgnoreCase)
|| name.Equals("..", StringComparison.OrdinalIgnoreCase)
|| name.Equals("CON", StringComparison.OrdinalIgnoreCase)
|| name.Equals("PRN", StringComparison.OrdinalIgnoreCase)
|| name.Equals("AUX", StringComparison.OrdinalIgnoreCase)
|| name.Equals("NUL", StringComparison.OrdinalIgnoreCase)
|| name.Equals("COM1", StringComparison.OrdinalIgnoreCase)
|| name.Equals("COM2", StringComparison.OrdinalIgnoreCase)
|| name.Equals("COM3", StringComparison.OrdinalIgnoreCase)
|| name.Equals("COM4", StringComparison.OrdinalIgnoreCase)
|| name.Equals("COM5", StringComparison.OrdinalIgnoreCase)
|| name.Equals("COM6", StringComparison.OrdinalIgnoreCase)
|| name.Equals("COM7", StringComparison.OrdinalIgnoreCase)
|| name.Equals("COM8", StringComparison.OrdinalIgnoreCase)
|| name.Equals("COM9", StringComparison.OrdinalIgnoreCase)
|| name.Equals("LPT1", StringComparison.OrdinalIgnoreCase)
|| name.Equals("LPT2", StringComparison.OrdinalIgnoreCase)
|| name.Equals("LPT3", StringComparison.OrdinalIgnoreCase)
|| name.Equals("LPT4", StringComparison.OrdinalIgnoreCase)
|| name.Equals("LPT5", StringComparison.OrdinalIgnoreCase)
|| name.Equals("LPT6", StringComparison.OrdinalIgnoreCase)
|| name.Equals("LPT7", StringComparison.OrdinalIgnoreCase)
|| name.Equals("LPT8", StringComparison.OrdinalIgnoreCase)
|| name.Equals("LPT9", StringComparison.OrdinalIgnoreCase))
return false;
return true;
}
For checking path names, you can use the similar Path.GetInvalidPathChars() method:
bool IsValidPathName(string name)
{
// empty path is not allowed
if (string.IsNullOrEmpty(name))
return false;
// check for characters that are not allowed in a path name
if (Path.GetInvalidPathChars().Any(c => name.Contains(c))
return false;
// check the file name part
if (!IsValidFileName(Path.GetFileName(name))
return false;
return true;
}