Мне нужно было сделать это сегодня ... в моем случае мне нужно было объединить имя клиента с датой и временем для окончательного файла .kmz. Мое окончательное решение было таким:
string name = "Whatever name with valid/invalid chars";
char[] invalid = System.IO.Path.GetInvalidFileNameChars();
string validFileName = string.Join(string.Empty,
string.Format("{0}.{1:G}.kmz", name, DateTime.Now)
.ToCharArray().Select(o => o.In(invalid) ? '_' : o));
Вы даже можете заменить его пробелами, если добавите символ пробела в недопустимый массив.
Может быть, это не самый быстрый, но, поскольку производительность не была проблемой, я нашел ее элегантной и понятной.
Ура!