Удалите недопустимые (запрещенные, плохие) символы из FileName (или Directory, Folder, File)

Я написал этот маленький метод для достижения цели в subj. Однако существует ли более эффективный (более простой) способ сделать это? Надеюсь, это поможет кому-то, кто будет искать это, как я.

var fileName = new System.Text.StringBuilder();
fileName.Append("*Bad/\ :, Filename,? ");
// get rid of invalid chars
while (fileName.ToString().IndexOfAny(System.IO.Path.GetInvalidFileNameChars()) > -1)
{
    fileName = fileName.Remove(fileName.ToString().IndexOfAny(System.IO.Path.GetInvalidFileNameChars()), 1);
}

?

Ответы

Ответ 1

Попробуйте выполнить

public string MakeValidFileName(string name) {
  var builder = new StringBuilder();
  var invalid = System.IO.Path.GetInvalidFileNameChars();
  foreach ( var cur in name ) {
    if ( !invalid.Contains(cur) ) {
      builder.Append(cur);
    }
  }
  return builder.ToString();
}

Ответ 2

Я знаю, что это несколько лет, но вот еще одно решение для справки.

public string GetSafeFilename(string filename)
{

    return string.Join("_", filename.Split(Path.GetInvalidFileNameChars()));

}

Ответ 3

Другой подход, совместимый с .NET 4. См. мои комментарии выше, объясняющие необходимость.

public static string ScrubFileName(string value)
{
   var sb = new StringBuilder(value);
   foreach (char item in Path.GetInvalidFileNameChars())
   {
      sb.Replace(item.ToString(), "");
   }
   return sb.ToString();
}

Ответ 4

Если вы просто говорите "сжатый":

public string StripInvalidChars(string filename) {
  return new String(
    filename.Except(System.IO.Path.GetInvalidFileNameChars()).ToArray()
  );
}

Тем не менее, я бы пошел с решением JaredPar. Это, вероятно, легче читать (в зависимости от вкуса, фона), мое чувство кишки состоит в том, что оно более эффективно (хотя я не уверен, насколько эффективно вы должны снимать десятки недействительных символов из ограниченного имени файла) и его использование от StringBuilder(), кажется, идеально подходит вашему примеру.