Коды кодирования файлов

Есть ли встроенный метод в .net для кодирования пути к файлу таким же образом, как вы кодируете URL-адрес? Например, если у меня есть недопустимые символы в имени файла, например "что угодно: что угодно", я бы хотел, чтобы он кодировал ":", поэтому он все еще там, просто закодирован, чтобы система его приняла. Я хотел бы сделать что-то вроде Path.Encode(fileName)

Что-нибудь вроде этого?

Вот что я делаю. Я соскабливаю wikipedia.org для игры, которую я создал в www.wikipediamaze.com. Когда я делаю скрипинг экрана, я кэширую результаты в файле в папке app_data, который соответствует имени текущей темы сайта википедии, в котором я включен. Например, если я нахожусь в этом месте:

http://www.wikipedia.org/wiki/Kevin_Bacon

Затем я очищаю эту страницу, анализирую ее, очищаю и т.д., а затем кеширую на диске для более быстрого обновления. Он сохраняется в месте /App_Data/Kevin_Bacon (no file extension). Это отлично работает, если я не на странице, например

http://www.wikipedia.org/wiki/Wikipedia:About

попытка создать файл в /App_Data/Wikipedia:About явно не работает, поскольку символ ":" является незаконным в имени файла.

UPDATE

Это отлично работает для меня:

    public static string EncodeAsFileName(this string fileName)
    {
        return Regex.Replace(fileName, "[" + Regex.Escape(                             
                new string(Path.GetInvalidFileNameChars())) + "]", " ");
    }

Ответ 1

Недействительные символы: \/:? "< > |

Вам просто нужно использовать функцию GetInvalidFileNameChars: (http://msdn.microsoft.com/library/system.io.path.getinvalidfilenamechars.aspx)

string sanitizedString = Regex.Replace("Wikipedia:About", "[" + Regex.Escape(new string(Path.GetInvalidFileNameChars())) + "]", "_");

Все недопустимые символы будут заменены на _ (подчеркивание).

Ответ 2

Нет, боюсь, в BCL нет ничего, что было бы в нем.

Вам нужно будет написать свою собственную функцию, которая заменяет неверные символы (путем повторения ввода и использования StringBuilder, возможно). Однако метод System.IO.Path.GetInvalidFileNameChars() поможет вам сделать это.

Самое простое решение, однако, может состоять в том, чтобы поймать исключение, которое вызывается, когда в пути указан недействительный char и обеспечивает обратную связь с пользователем.

Ответ 3

Вам нужно, чтобы имена файлов были точно такими же, как в URL-адресе?

Если нет, используйте имена файлов Base64. Всякий раз, когда вы создаете файл, конвертируйте имя файла в base64 перед записью или чтением файла.

static public string EncodeTo64(string toEncode)
{
    byte[] bytes
          = System.Text.ASCIIEncoding.ASCII.GetBytes(toEncode);
    string stringBase64
          = System.Convert.ToBase64String(bytes);
    return stringBase64;
}

string fileName64 = Path.Combine(AppDataPath, EncodeTo64("Wikipedia:About"));

Изменить: я понял, что Base64 имеет символ "/", который является недопустимым символом для имени файла. Замените "/" на "-" после преобразования.