如何从两个不同的项目中获取文件夹的相对路径

问题描述 投票:0回答:3

我有两个项目和一个共享库,用于从此文件夹加载图像:

"C:/MainProject/Project1/Images/"

Project1的文件夹:

"C:/MainProject/Project1/Files/Bin/x86/Debug"
(那里有project1.exe)

Project2的文件夹:

"C:/MainProject/Project2/Bin/x86/Debug"
(其中有project2.exe)

当我调用共享库函数加载图像时,我需要获取“Images”文件夹的相对路径,因为我会从project1或project2调用该函数。另外,我会将我的 MainProject 移动到其他计算机中,因此我不能使用绝对路径。

从 Project1 我会做:

Directory.GetParent(Directory.GetCurrentDirectory()).Parent.Parent.Parent.FullName + @"\Images";

从 Project2 我会做:

Directory.GetParent(Directory.GetCurrentDirectory()).Parent.Parent.Parent.FullName + @"Project1\Images";

如何获取两个项目文件夹的相对路径?

c# path relative-path
3个回答
2
投票

您可能想稍微测试一下这段代码并使其更加健壮,但只要您不向其传递 UNC 地址,它就应该可以工作。 它的工作原理是将路径拆分为目录名称并从左到右比较它们。然后就建立了相对路径。

    public static string GetRelativePath(string sourcePath, string targetPath)
    {
        if (!Path.IsPathRooted(sourcePath)) throw new ArgumentException("Path must be absolute", "sourcePath");
        if (!Path.IsPathRooted(targetPath)) throw new ArgumentException("Path must be absolute", "targetPath");

        string[] sourceParts = sourcePath.Split(Path.DirectorySeparatorChar);
        string[] targetParts = targetPath.Split(Path.DirectorySeparatorChar);

        int n;
        for (n = 0; n < Math.Min(sourceParts.Length, targetParts.Length); n++ )
        {
            if (!string.Equals(sourceParts[n], targetParts[n], StringComparison.CurrentCultureIgnoreCase))
            {
                break;
            }
        }

        if (n == 0) throw new ApplicationException("Files must be on the same volume");
        string relativePath = new string('.', sourceParts.Length - n).Replace(".", ".." + Path.DirectorySeparatorChar);
        if (n <= targetParts.Length)
        {
            relativePath += string.Join(Path.DirectorySeparatorChar.ToString(), targetParts.Skip(n).ToArray());
        }

        return string.IsNullOrWhiteSpace(relativePath) ? "." : relativePath;
    }

不要使用 Directory.GetCurrentDirectory,而是考虑使用 Path.GetDirectory(Process.GetCurrentProcess().MainModule.FileName)。您当前的目录可能与您的 exe 文件不同,这会破坏您的代码。 MainModule.FileName 直接指向您的 exe 文件的位置。


0
投票

我的建议是将共享(图像)目录保留在exe文件所在的位置。换句话说,您的项目的安装文件夹。现在要找到安装目录,请使用以下代码:-

    var imageFolderName = "SharedImage";
    var loc = System.Reflection.Assembly.GetExecutingAssembly().Location;
    var imagePath = Path.Combine(loc, imageFolderName);

0
投票

.NET 有 Path.GetRelativePath 方法,在 .NET Framework 中使用以下代码:

public static string GetRelativePath(string relativeTo, string path)
{
    var sourceParts = Path.GetDirectoryName(Path.GetFullPath(relativeTo)).Split(Path.DirectorySeparatorChar);
    var targetParts = Path.GetFullPath(path).Split(Path.DirectorySeparatorChar);

    var n = 0;
    while (n < Math.Min(sourceParts.Length, targetParts.Length))
    {
        if (!string.Equals(sourceParts[n], targetParts[n], StringComparison.CurrentCultureIgnoreCase))
            break;
        n += 1;
    }

    if (n == 0) throw new NotSupportedException("Files must be on the same volume");
    var relativePath = string.Join("", Enumerable.Repeat(".." + Path.DirectorySeparatorChar, sourceParts.Length - n));
    if (n <= targetParts.Length)
        relativePath += string.Join(Path.DirectorySeparatorChar.ToString(), targetParts.Skip(n));

    return string.IsNullOrWhiteSpace(relativePath) ? "." : relativePath;
}
© www.soinside.com 2019 - 2024. All rights reserved.