我在数据库字段中存储了一个相对路径。它看起来是这样的:
/images/2012-6/file.jpg我可以通过以下方式访问绝对Url:
http://www.blah.com/images/2012-6/file.jpg缩略图相对路径未存储在数据库表中。然而,我知道它可以在以下位置找到:
http://www.blah.com/images/thumbnails/2012-6/file.jpg假设我知道http://www.blah.com/和/images/2012-6/file.jpg,那么确定以下内容的最佳算法是什么:
http://www.blah.com/images/thumbnails/2012-6/file.jpg注意:命名方案可以是相对路径和缩略图文件夹根路径上的多个文件夹。即/images/whatever/something/thumbnails/"。
您可以做的一个也是唯一的假设是,两者都将从相同的第一个段(文件夹)开始。即/images/。
这是在一个控制台应用程序中(如果我可以的话没有System.Web )。这是到目前为止的the best I have come up:
public static void Main()
{
var test = GetThumbnail("http://www.blah.com/", "/images/folder/subfolder/test/again/filename.jpg", "/images/extra/thumbnails/");
Console.WriteLine(test);
}
private static string GetThumbnail(string baseUriString, string relativePath, string thumbsPath)
{
var root = new Uri(baseUriString, UriKind.Absolute);
var absolute = new Uri(root, relativePath);
var segments = absolute.Segments;
var thumbnailUri = new Uri(root, thumbsPath);
var thumbSegments = thumbnailUri.Segments;
var matchedRoot = Array.IndexOf(segments, thumbSegments[1]);
var builder = new UriBuilder(root);
for (var j = 1; j < segments.Length; j++)
{
if (j == matchedRoot)
{
for (var k = 1; k < thumbSegments.Length; k++)
{
builder.Path += thumbSegments[k];
}
}
else
{
builder.Path += segments[j];
}
}
return builder.Uri.ToString();
}这似乎令人费解。有没有更好的方法呢?
发布于 2014-02-28 03:22:08
如果我正确地理解了您的需求,您基本上想要:
找到重叠的第一个片段
您的代码已经做到了这一点,但我相信下面的代码会让这些步骤变得更加清晰:
private static string GetThumbnail(string baseUriString, string relativePath, string thumbsPath)
{
// 1. Break the paths into segments
// the trim here is important to prevent empty list items or "//" when we rebuild later.
List<string> relativeSegments = relativePath.Trim('/').Split('/').ToList();
List<string> thumbsSegments = thumbsPath.Trim('/').Split('/').ToList();
// 2. Find the first segment of thumbs in the relative segments
int sharedSegmentIndex = relativeSegments.IndexOf(thumbsSegments[0]);
// 3. Insert all the thumbs segments into that spot in the Uri.
// remove the overlapping segment (because we're adding it again below)
relativeSegments.RemoveAt(sharedSegmentIndex);
// insert the thumbs segment
relativeSegments.InsertRange(sharedSegmentIndex, thumbsSegments);
// build up the full path.
var root = new Uri(baseUriString, UriKind.Absolute);
var builder = new UriBuilder(root);
builder.Path += string.Join("/", relativeSegments);
return builder.Uri.ToString();
}此外,这里是我的快速和肮脏的测试套件,所以你可以检查我做出了正确的期望输出,以及任何其他想要修补的人。
public static void Main()
{
RunTest("http://www.blah.com/", "/images/2012-6/file.jpg", "/images/thumbnails/", "http://www.blah.com/images/thumbnails/2012-6/file.jpg");
RunTest("http://www.blah.com/", "/images/folder/subfolder/test/again/filename.jpg", "/images/extra/thumbnails/", "http://www.blah.com/images/extra/thumbnails/folder/subfolder/test/again/filename.jpg");
RunTest("http://www.blah.com/", "/myapp/images/folder/subfolder/test/again/filename.jpg", "/images/extra/thumbnails/", "http://www.blah.com/myapp/images/extra/thumbnails/folder/subfolder/test/again/filename.jpg");
}
public static void RunTest(string baseUriString, string relativePath, string thumbsPath, string expected)
{
var result = GetThumbnail(baseUriString, relativePath, thumbsPath);
Debug.Assert(result == expected);
}https://stackoverflow.com/questions/22073454
复制相似问题