使用WebClient访问本地文件

Att*_*ila 2 .net c# uri webclient

我开发了一个C#应用程序,它需要通过HTTP,FTP和有时本地文件(file://)访问许多不同的内容源.

我希望有一种统一的方式,我通过不同的协议访问这些文件,所以我选择了WebClient来做到这一点.

它适用于MSDN(FTP,HTTP,本地文件等)上记录的所有不同协议,但随后出现问题...在几次成功请求之后我无法使用URI访问本地文件的任何文件(文件:// C:\ some_dir\somefile.ext).

我已经检查过URI是否正确,如果我在浏览器中输入它,则可以轻松打开文件.我已经认识到一个非常有趣的事情 - 它在本地文件的开头也很好用.如果我尝试使用WebClient加载本地文件的内容,那么一开始它一切正常.

我的程序看起来像这样:

  1. 主线程开始
  2. 主线程上的一些初始化
  3. 多个线程从不同来源下载东西
  4. 等待所有线程完成
  5. 单线程处理下载的东西

正如我之前所描述的,如果我在第一步中调用我的WebClient.DownloadData(url)调用,它工作正常,但是当我尝试在第三步的任何线程中访问COMPLETELY相同的URI时,它无法获得URI以"file://"开头的任何本地文件.

我使用一个非常简单的代码来下载/获取本地文件:

WebClient wc = new WebClient();
data = wc.DownloadData(url);
Run Code Online (Sandbox Code Playgroud)

我想知道可能出现什么问题......也许我在之前的步骤中设置了一些东西,或者在并发线程中阻止我访问本地文件?在之前的步骤中,我会从FTP服务器和HTTP上下载内容,这可能导致问题?如果我在主线程的开头尝试,我可以轻松访问任何本地文件.访问FTP内容时,我也设置了凭据.也许这是我后来要求的影响?

Jam*_*mie 11

好吧,事实上我在这里,但希望这可以帮助别人.

而不是字符串路径,你最好使用Uri对象.当它是本地文件时,让Uri构造函数处理"file://"部分.实际的URI更喜欢斜杠到反斜杠,即使对于本地文件也是如此.如果你只是使用Uri对象,你不必担心.

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

当然,你需要错误处理等等,但这基本上对我有用.

如果您只想使用File.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;
}
Run Code Online (Sandbox Code Playgroud)