一段时间以来,我一直在寻找一种适用于URL的Path.Combine方法.这与URL的Path.Combine类似?有一个很大的区别.
我将以一个例子来说明.假设我们有一个基本网址:http://example.com/somefolder和一个文件:foo.txt.因此,完整的路径将是:http://example.com/somefolder/foo.txt.听起来很简单吧?哈.
我尝试了Uri课:Uri.TryCreate(new Uri("http://example.com/somefolder"), "foo.txt", out x);结果"http://example.com/foo.txt".
然后我尝试了Path:System.IO.Path.Combine("http://example.com/somefolder", "foo.txt");结果"http://example.com/somefolder\foo.txt"......更近,但仍然没有.
为了踢,我接着尝试了:System.IO.Path.Combine("http://example.com/somefolder/", "foo.txt")结果"http://example.com/somefolder/foo.txt".
最后一个工作,但它基本上在那时进行字符串连接.
所以我认为我有两个选择:
我错过了一个内置的框架方法吗?
更新:我的用例是下载一堆文件.我的代码看起来像这样:
public void Download()
{
var folder = "http://example.com/somefolder";
var filenames = getFileNames(folder);
foreach (var name in filenames)
{
downloadFile(new Uri(folder + "/" + name));
}
}
Run Code Online (Sandbox Code Playgroud)
我不得不在Uri构造函数中使用字符串concat,并且还要检查是否需要斜杠(我在代码中省略了).
在我看来,我想要做的事情会出现很多,因为Uri类除了http之外还处理很多其他协议.
Tod*_*ier 18
Flurl [披露:我是作者]是一个很小的URL构建器库,可以用它的Url.Combine方法填补空白:
string url = Url.Combine("http://www.foo.com/", "/too/", "/many/", "/slashes/", "too", "few");
// result: "http://www.foo.com/too/many/slashes/too/few"
Run Code Online (Sandbox Code Playgroud)
你可以通过NuGet得到它:Install-Package Flurl.
我还想指出,您可以通过并行下载文件来显着提高代码的效率.有几种方法可以做到这一点.如果您使用的是.NET 4.5或更高版本,并且可以将其重写downloadFile为异步方法,那么您最好的选择就是用以下方法替换您的for循环:
var tasks = filenames.Select(f => downloadFileAsync(Url.Combine(folder, f)));
await Task.WhenAll(tasks);
Run Code Online (Sandbox Code Playgroud)
否则,如果你坚持使用.NET 4,你仍然可以通过使用Parallel.ForEach轻松实现并行化:
Parallel.ForEach(filenames, f => downloadFile(Url.Combine(folder, f)));
Run Code Online (Sandbox Code Playgroud)
小智 8
这就是Uri课程的工作方式.
var otherUri = new Uri("http://example.com/somefolder"));
// somefolder is just a path
var somefolder = otherUri.GetComponents(UriComponents.PathAndQuery, UriFormat.UriEscaped);
// example one
var baseUri = new Uri("http://example.com/");
var relativeUri = new Uri("somefolder/file.txt",UriKind.Relative);
var fullUri = new Uri(baseUri, relativeUri);
// example two
var baseUri = new Uri("http://example.com/somefolder");
var relativeUri = new Uri("somefolder/file.txt",UriKind.Relative);
var fullUri = new Uri(baseUri, relativeUri);
// example three
var baseUri = new Uri("http://example.com/");
var fullUri = new Uri(baseUri, "somefolder/file.txt");
Run Code Online (Sandbox Code Playgroud)
基本上通过最简单的字符串操作来做
var isValid = Uri.TryCreate(..., out myUri);
Run Code Online (Sandbox Code Playgroud)
如果你想了解更多.看看这篇文章C#Url Builder Class
更新的答案
当提到基础uri时,它总是http://example.com/右边的任何东西都只是路径.
void Main()
{
var ub = new UriBuilder("http://example.com/somefolder");
ub.AddPath("file.txt");
var fullUri = ub.Uri;
}
public static class MyExtensions
{
public static UriBuilder AddPath(this UriBuilder builder, string pathValue)
{
var path = builder.Path;
if (path.EndsWith("/") == false)
{
path = path + "/";
}
path += Uri.EscapeDataString(pathValue);
builder.Path = path;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
24015 次 |
| 最近记录: |