2009-07-03 67 views
2

我正在構建一個應用程序,它使用精心設計的API從Youtube中獲取數據,並將數據文件與相應視頻的名稱一起保存爲文件名。但是,我的程序崩潰了,因爲YouTube上的很多視頻在其標題中都有字符,這些字符在Windows下的文件名中是非法的。URLEncode將解決此問題與文件名稱(C#)中的非法字符?

將URLEncoding視頻的標題解決這個問題?

如果是這樣,這是最好的使用方法,並且這將是實現URLEncode的最好方法是什麼?

謝謝! :)

回答

4

那麼,如果你想要做的URL編碼,您可以使用HttpUtility.UrlEncode。雖然我不確定。它可能去掉你想要的所有字符,但它也會做其他的。

我想我可能會使用Path.GetInvalidFilenameChars和只需更換任何在用下劃線名稱無效。

這是一個不可逆的編碼,當然,但我認爲它會產生哪些文件名更容易理解。您可能希望創建一個索引文件,該文件也可以從原始標題映射到文件名。

+0

謝謝!我不知道那樣的東西存在!我會嘗試並報告它是否有效。 :) – 2009-07-03 06:10:21

1

URL編碼應該解決的問題,因爲它應該取代任何無效字符(以及一些有效的),隨後用一組十六進制的「%」;據我所知,這是有效的文件系統名稱。

這就引出了兩個問題,但:

  1. 是能夠乾淨地讀取的文件名,用戶很重要?如果不是,最好使用唯一的文件名(1.file,2.file,3.file)和映射文件名 - >標題

  2. 如果兩個視頻具有相同的名稱會發生​​什麼?我想,這是第一個問題的延伸。

  3. 如果什麼標題時(URL編碼)長度超過最大文件名長度?如果我沒有記錯,在NTFS上文件名的最大長度是255個字符;如果標題中的每個字符擴展爲3個字符以進行網址編碼,則可以用85個字符標題滿足255個字符的限制。

編輯/更新:UrlEncode認爲有一些字符是無效的文件系統字符;我特意遇到的是'\'。所以,不,Url編碼將不安全。

+0

是的我在考慮是否使用唯一的文件名,但第二個問題其實很重要 - 我需要記住添加一些實現以確保文件名不一樣。謝謝! – 2009-07-03 06:11:38

0

您可以使用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的。

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(); 
    } 

這感覺有點怪有寫所有這些代碼,但至少我得到的是安全與OS使用可讀的文件名。

相關問題