2012-10-25 79 views
2

我開發了一個C#應用程序,它需要通過HTTP,FTP以及有時還需要本地文件(file://)來訪問許多不同的內容源。使用WebClient訪問本地文件

我想要一個統一的方式,通過不同的協議訪問這些文件,所以我選擇了WebClient來完成這個任務。

它適用於MSDN(FTP,HTTP,本地文件等)中記錄的所有不同協議,但出現了一些問題......在幾次成功請求後,我無法使用URI訪問任何文件對於本地文件(文件:// c:\ some_dir \ somefile.ext)。

我已經檢查過URI是否正確,如果我在瀏覽器中輸入它,它很容易打開文件。我已經認識到一件非常有趣的事情 - 它在本地文件的開頭也很有效。如果我嘗試使用WebClient加載本地文件的內容,那麼在開始時一切正常。

我的計劃是這樣的:

  1. 主線程開始
  2. 在主線程上進行一些初始化
  3. 多個線程從不同的來源下載的東西
  4. 等待所有線程完成
  5. 單螺紋加工dowloaded東西

正如我前面所描述的,如果我在第一步中放入WebClient.DownloadData(url)調用,它可以正常工作,但是當我嘗試在第三步的任何線程中訪問完全相同的URI時,獲取任何以「file://」開頭的本地文件。

我用一個非常簡單的代碼來下載/獲取本地文件:

WebClient wc = new WebClient(); 
data = wc.DownloadData(url); 

我不知道什麼可能出問題......也許我將在前面的步驟或阻止我併發線程的東西訪問本地文件?在之前的步驟中,我會從FTP服務器下載內容並通過HTTP,可能會導致問題?如果我在主線程的開頭嘗試,我可以輕鬆訪問任何本地文件。訪問FTP內容時,我也設置了憑據。也許這是我後來要求的效果?

+0

你嘗試使用:文件:/// C:/tmp/myfile.txt,它有3個 「/」 – urlreader

+0

否 - 感謝注意到! –

回答

11

好了,我在這裏事後的方式,但希望,這可以幫助某人。

而不是字符串路徑,你最好使用Uri對象。當它是本地文件時,讓Uri構造函數處理「file://」部分。實際的URI首選斜槓反斜槓,即使是本地文件。如果你只是使用Uri對象,你不必擔心。

public byte[] Load(string fileName) 
{ 
    Uri uri = new Uri(fileName); 
    var client = new WebClient(); 
    return client.DownloadData(uri); 
} 

當然,你需要錯誤處理等,但這基本上是適合我的。

如果您只想使用文件。ReadAllBytes()方法,這是你將如何做到這一點。

public byte[] Load(string fileName) 
{ 
    Byte[] retVal = null; 
    Uri uri = new Uri(fileName); 
    if(uri.Scheme == "file") 
    { 
     retVal = File.ReadAllBytes(uri.LocalPath); 
    } 
    else 
    { 
     var client = new WebClient(); 
     retVal = client.DownloadData(uri); 
    } 
    return retVal; 
} 
0

現在我有一個非常簡單的解決方案來解決這個問題:

  byte[] data; 
      if (url.Trim().StartsWith("file://")) 
      {      
       string fileName = url.Replace("file://",""); 
       data = File.ReadAllBytes(fileName); 
      } 
      else 
      { 
       WebClient wc = new WebClient(); 
       //wc.Proxy = GlobalProxySelection.GetEmptyWebProxy(); 
       data = wc.DownloadData(url); 
      } 
      // process data... 

這種運作良好,但我仍然不知道有什麼可以去錯的Web客戶端...

+0

這是不具有普遍性。例如。通過這種方式訪問​​網絡驅動器將不起作用。 – czubehead