我有两个项目和一个共享库,用于从此文件夹加载图像:
"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";
如何获取两个项目文件夹的相对路径?
您可能想稍微测试一下这段代码并使其更加健壮,但只要您不向其传递 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 文件的位置。
我的建议是将共享(图像)目录保留在exe文件所在的位置。换句话说,您的项目的安装文件夹。现在要找到安装目录,请使用以下代码:-
var imageFolderName = "SharedImage";
var loc = System.Reflection.Assembly.GetExecutingAssembly().Location;
var imagePath = Path.Combine(loc, imageFolderName);
.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;
}