For awhile now, I've been searching for a Path.Combine method that works on URLs. This is similiar to Path.Combine for URLs? with one big difference.
I'll illustrate with an example. Say we have a base url: http://example.com/somefolder
and a file: foo.txt
. Thus, the full path would be: http://example.com/somefolder/foo.txt
. Sounds simple, right? Ha.
I tried the Uri class: Uri.TryCreate(new Uri("http://example.com/somefolder"), "foo.txt", out x);
which resulted in "http://example.com/foo.txt"
.
Then I tried Path: System.IO.Path.Combine("http://example.com/somefolder", "foo.txt");
which resulted in "http://example.com/somefolder\foo.txt"
... Closer, but still no.
For kicks, I then tried: System.IO.Path.Combine("http://example.com/somefolder/", "foo.txt")
which resulted in "http://example.com/somefolder/foo.txt"
.
The last one worked, but it's basically doing string concatenation at that point.
So I think I have two options:
- Use Path.Combine and replace all \ with /
- Use basic string concatenation
Am I missing a built in framework method for this?
UPDATE: The usage case I have is for downloading a bunch of files. My code looks like this:
public void Download()
{
var folder = "http://example.com/somefolder";
var filenames = getFileNames(folder);
foreach (var name in filenames)
{
downloadFile(new Uri(folder + "/" + name));
}
}
I'm miffed at having to use string concat in the Uri constructor, as well having to check if the slash is needed (which I omitted in the code).
It seems to me that what I'm trying to do would come up a lot, since the Uri class handles a lot of other protocols besides http.
Here is a LINQ version of something close to the above answer.
Omg, why all of you write such complex code? It is very simple:
Example of use:
Result url is "http://something.com/task/status/dfgd/111/qqq"
I have a static method for this purpose:
This is how the Uri class works.
Basically do it via string manipulation simplest and do
If you want to find out more. Check out this post C# Url Builder Class
Updated answer
When referring to base uri it will always be http://example.com/ anything to the right is just path.
Flurl [disclosure: I'm the author] is a tiny URL builder library that can fill the gap with its
Url.Combine
method:You can get it via NuGet:
Install-Package Flurl
.I also wanted to point out that you can dramatically improve the efficiency of your code by downloading the files in parallel. There's a couple ways to do that. If you're on .NET 4.5 or above and can rewrite
downloadFile
as an async method, then your best option would be to replace yourfor
loop with something like this:Otherwise, if you're stuck on .NET 4, you can still achieve parallelism easily by using Parallel.ForEach: