我正在構建一個應用程序,它使用精心設計的API從Youtube中獲取數據,並將數據文件與相應視頻的名稱一起保存爲文件名。但是,我的程序崩潰了,因爲YouTube上的很多視頻在其標題中都有字符,這些字符在Windows下的文件名中是非法的。URLEncode將解決此問題與文件名稱(C#)中的非法字符?
將URLEncoding視頻的標題解決這個問題?
如果是這樣,這是最好的使用方法,並且這將是實現URLEncode的最好方法是什麼?
謝謝! :)
我正在構建一個應用程序,它使用精心設計的API從Youtube中獲取數據,並將數據文件與相應視頻的名稱一起保存爲文件名。但是,我的程序崩潰了,因爲YouTube上的很多視頻在其標題中都有字符,這些字符在Windows下的文件名中是非法的。URLEncode將解決此問題與文件名稱(C#)中的非法字符?
將URLEncoding視頻的標題解決這個問題?
如果是這樣,這是最好的使用方法,並且這將是實現URLEncode的最好方法是什麼?
謝謝! :)
那麼,如果你想要做的URL編碼,您可以使用HttpUtility.UrlEncode
。雖然我不確定。它可能去掉你想要的所有字符,但它也會做其他的。
我想我可能會使用Path.GetInvalidFilenameChars
和只需更換任何在用下劃線名稱無效。
這是一個不可逆的編碼,當然,但我認爲它會產生哪些文件名更容易理解。您可能希望創建一個索引文件,該文件也可以從原始標題映射到文件名。
URL編碼應該解決的問題,因爲它應該取代任何無效字符(以及一些有效的),隨後用一組十六進制的「%」;據我所知,這是有效的文件系統名稱。
這就引出了兩個問題,但:
是能夠乾淨地讀取的文件名,用戶很重要?如果不是,最好使用唯一的文件名(1.file,2.file,3.file)和映射文件名 - >標題
如果兩個視頻具有相同的名稱會發生什麼?我想,這是第一個問題的延伸。
如果什麼標題時(URL編碼)長度超過最大文件名長度?如果我沒有記錯,在NTFS上文件名的最大長度是255個字符;如果標題中的每個字符擴展爲3個字符以進行網址編碼,則可以用85個字符標題滿足255個字符的限制。
編輯/更新:UrlEncode認爲有一些字符是無效的文件系統字符;我特意遇到的是'\'。所以,不,Url編碼將不安全。
是的我在考慮是否使用唯一的文件名,但第二個問題其實很重要 - 我需要記住添加一些實現以確保文件名不一樣。謝謝! – 2009-07-03 06:11:38
您可以使用youtube的視頻ID代替視頻名稱嗎?例如V = Yk6oPsKZG_w。或者你沒有訪問權限?這些似乎包含簡單的字母數字,並且在YouTube中應該是唯一的。
我不確定urlencode是否會幫助您在視頻名稱中使用星號。
如果您仍想使用視頻名稱,您可能需要查看使用「\\?\」前綴,它告訴Win32 API禁用所有字符串解析並將該字符串直接發送到文件系統。
http://msdn.microsoft.com/en-us/library/aa365247(VS.85).aspx#path_names_and_namespaces
我不知道,如果你可以使用與.NET API,或者如果你將不得不使用的DllImport直接調用Win32 API的。
我結束了一個類似的問題,這樣做:
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();
}
這感覺有點怪有寫所有這些代碼,但至少我得到的是安全與OS使用可讀的文件名。
謝謝!我不知道那樣的東西存在!我會嘗試並報告它是否有效。 :) – 2009-07-03 06:10:21