gpt4 book ai didi

c# - 使用 WebClient 访问本地文件

转载 作者:行者123 更新时间:2023-11-30 19:11:07 24 4
gpt4 key购买 nike

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

我想以一种统一的方式通过不同的协议(protocol)访问这些文件,因此我选择了 WebClient 来执行此操作。

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

我已经检查过 URI 是否正确,如果我在浏览器中输入它,它可以轻松打开文件。我发现了一件非常有趣的事情——它在开始时也适用于本地文件。如果我尝试使用 WebClient 加载本地文件的内容,一开始一切正常。

我的程序是这样的:

  1. 主线程开始
  2. 在主线程上进行一些初始化
  3. 多线程从不同来源下载内容
  4. 等待所有线程完成
  5. 单线程处理下载内容

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

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

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

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

最佳答案

好吧,我是在事后才来到这里的,但希望这能对某人有所帮助。

与其使用字符串路径,不如使用 Uri 对象。当它是本地文件时,让 Uri 构造函数处理“file://”部分。实际的 URI 更喜欢斜杠而不是反斜杠,即使对于本地文件也是如此。不过,如果您只使用 Uri 对象,则不必担心。

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

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

如果您只想使用 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;
}

关于c# - 使用 WebClient 访问本地文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13074555/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com