Будет ли URLEncode решить эту проблему с недопустимыми символами в именах файлов (C #)?

2

Я создаю приложение, которое использует сложный API для извлечения данных из Youtube, и файлы данных сохраняются с именем соответствующего видео в качестве имени файла. Тем не менее, моя программа рушится, потому что довольно много видео на YouTube имеют символы в их названиях, которые незаконны для использования в именах файлов под Windows.

Будет ли URLEncoding заголовок видео исправлять эту проблему?

Если да, то это лучший метод для использования, и какой был бы лучший способ реализовать URLEncode?

Спасибо!:)

Теги:
urlencode

4 ответа

4
Лучший ответ

Ну, если вы хотите сделать кодировку url, вы можете использовать HttpUtility.UrlEncode. Я не уверен, что буду. Он может вычеркнуть все символы, которые вы хотите, но он будет делать и другие.

Я думаю, что я, вероятно, использовал бы Path.GetInvalidFilenameChars и просто заменил бы что-нибудь недействительное в имени подчеркиванием.

Это не обратимая кодировка, конечно, но я думаю, что это создаст имена файлов, которые легче понять. Возможно, вы захотите создать индексный файл, который также отображает исходный заголовок для имени файла.

  • 0
    Спасибо! Я не знал, что что-то подобное существует! Я попробую это и сообщу, работает ли это или нет. :)
1

Url Encoding должна устранить проблему, так как она должна заменить любой недопустимый char (и несколько действительных) с помощью "%", за которым следует набор hex; насколько я знаю, что подходит для имен файловой системы.

Это вызывает два вопроса:

  • Является ли возможность чистого чтения имени файла, важного для пользователя? Если нет, возможно, лучше использовать уникальное имя файла (1.file, 2.file, 3.file) и сопоставление из имени файла → title

  • Что произойдет, если два видео имеют одинаковое имя? Я считаю, что это расширение первого вопроса.

  • Что делать, если заголовок (при кодировке url) длиннее, чем максимальная длина имени файла? Если я правильно помню, максимальная длина для имени файла составляет 255 символов в NTFS; если каждый char в заголовке расширяется до 3 символов для кодирования url, тогда предел 255 char может быть встречен с заголовком 85 char.

EDIT/Update: есть некоторые символы, которые UrlEncode считает допустимыми, которые являются недопустимыми символами файловой системы; тот, который я специально встретил, - это "\". Таким образом, нет, Url Encoding не будет безопасным.

  • 0
    Да, я думал о том, стоит ли просто использовать уникальные имена файлов, но этот второй вопрос на самом деле очень важен - мне нужно не забыть добавить некоторую реализацию, чтобы убедиться, что имена файлов не совпадают. Спасибо!
0

В итоге я сделал это с аналогичной проблемой:

    static string Escape(string input)
    {
        StringBuilder builder = new StringBuilder(input.Length);
        for (int i = 0; i < input.Length; i++)
        {
            if (Path.GetInvalidPathChars().Contains(input[i]) || Path.GetInvalidFileNameChars().Contains(input[i]) || input[i] == '%')
            {
                builder.Append(Uri.HexEscape(input[i]));
            }
            else
            {
                builder.Append(input[i]);
            }
        }
        return builder.ToString();
    }

    static string Unescape(string input)
    {
        StringBuilder builder = new StringBuilder(input.Length);
        int index = 0;
        while (index < input.Length)
        {
            builder.Append(Uri.HexUnescape(input, ref index));
        }
        return builder.ToString();
    }

Было немного странно писать весь этот код, но, по крайней мере, я получаю читаемые имена файлов, которые безопасны для использования с ОС.

0

Вместо имени видео вы можете использовать идентификатор видео YouTube? например v = Yk6oPsKZG_w. Или у вас нет доступа к этому? Кажется, что они содержат простые буквенно-цифровые символы и должны быть уникальными внутри youtube.

Я не уверен, что urlencode поможет вам со звездочками в видеоролике.

Если вы все еще хотите использовать имя видео, вы можете посмотреть, используя префикс "\\? \", который указывает API Win32 отключить весь синтаксический разбор строки и отправить эту строку прямо в файловую систему.

http://msdn.microsoft.com/en-us/library/aa365247(VS.85).aspx#path_names_and_namespaces

Я не уверен, если вы можете использовать это с .NET API или если вам придется использовать DllImport для непосредственного вызова Win32 API.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню