Я создаю приложение, которое использует сложный API для извлечения данных из Youtube, и файлы данных сохраняются с именем соответствующего видео в качестве имени файла. Тем не менее, моя программа рушится, потому что довольно много видео на YouTube имеют символы в их названиях, которые незаконны для использования в именах файлов под Windows.
Будет ли URLEncoding заголовок видео исправлять эту проблему?
Если да, то это лучший метод для использования, и какой был бы лучший способ реализовать URLEncode?
Спасибо!:)
Ну, если вы хотите сделать кодировку url, вы можете использовать HttpUtility.UrlEncode
. Я не уверен, что буду. Он может вычеркнуть все символы, которые вы хотите, но он будет делать и другие.
Я думаю, что я, вероятно, использовал бы Path.GetInvalidFilenameChars
и просто заменил бы что-нибудь недействительное в имени подчеркиванием.
Это не обратимая кодировка, конечно, но я думаю, что это создаст имена файлов, которые легче понять. Возможно, вы захотите создать индексный файл, который также отображает исходный заголовок для имени файла.
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 не будет безопасным.
В итоге я сделал это с аналогичной проблемой:
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();
}
Было немного странно писать весь этот код, но, по крайней мере, я получаю читаемые имена файлов, которые безопасны для использования с ОС.
Вместо имени видео вы можете использовать идентификатор видео 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.