【发布时间】:2011-10-06 08:00:50
【问题描述】:
我正在寻找一种干净的方法来更改可能包含多个段的绝对或相对 uri 的文件名。我们不知道它是绝对的还是相对的,所以我们需要检测:
这是测试用例:
[Test]
public void Can_change_path_file_name()
{
Fix("file.txt").ShouldEqual("file_fixed.txt");
Fix("/file.txt").ShouldEqual("/file_fixed.txt");
Fix("directory/file.txt").ShouldEqual("directory/file_fixed.txt");
Fix("/directory/file.txt").ShouldEqual("/directory/file_fixed.txt");
Fix("/directory/subdirectory/file.txt").ShouldEqual("/directory/subdirectory/file_fixed.txt");
Fix("http://www.test.com/directory/subdirectory/file.txt").ShouldEqual("http://www.test.com/directory/subdirectory/file_fixed.txt");
Fix("/directory/file/file.txt").ShouldEqual("/directory/file/file_fixed.txt");
}
private string Fix(string uri)
{
// fill me with goodness
}
我的解决方案有效,但似乎有点涉及。如果您想改进它,我已将其发布在下面:
private string Fix(string uri)
{
var fileName = Path.GetFileNameWithoutExtension(uri);
var extension = Path.GetExtension(uri);
fileName += "_fixed" + extension;
var path = uri.Contains('/') ? uri.Substring(0, uri.LastIndexOf('/') + 1) : "";
return Combine(path, fileName);
}
private string Combine(string path1, string path2)
{
if (path1 == null)
{
throw new ArgumentNullException("path1");
}
if (path2 == null)
{
throw new ArgumentNullException("path2");
}
if (String.IsNullOrEmpty(path2))
{
return path1;
}
if (String.IsNullOrEmpty(path1))
{
return path2;
}
if (path2.StartsWith("http://") || path2.StartsWith("https://"))
{
return path2;
}
var ch = path1[path1.Length - 1];
if (ch != '/')
{
return (path1.TrimEnd('/') + '/' + path2.TrimStart('/'));
}
return (path1 + path2);
}
【问题讨论】: