GetFullPath
函数默认假定相对于当前目录,除非你指定一个绝对路径。你应该手动将程序集路径与相对路径组合起来。然后,你可以规范化结果以获得一个干净的路径。
string assemblyPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
string filePathRelativeToAssembly = Path.Combine(assemblyPath, @"..\SomeFolder\SomeRelativeFile.txt");
string normalizedPath = Path.GetFullPath(filePathRelativeToAssembly);
例如,如果程序集位置为"C:\Test\MyAssembly.dll",则会得到以下结果。
assemblyPath = "C:\Test"
filePathRelativeToAssembly = "C:\Test\..\SomeFolder\SomeRelativeFile.txt"
normalizedPath = "C:\Test\SomeFolder\SomeRelativeFile.txt"
此外,如果您将绝对路径作为Path.Combine
的第二部分传递,它仍然会执行正确的操作。
string assemblyPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
string filePathRelativeToAssembly = Path.Combine(assemblyPath, @"C:\AbsoluteFile.txt");
string normalizedPath = Path.GetFullPath(filePathRelativeToAssembly);
会给你
filePathRelativeToAssembly = "C:\AbsoluteFile.txt"
normalizedPath = "C:\AbsoluteFile.txt"
Assembly.GetExecutingAssembly().CodeBase
(如果当然在dll的函数内部调用)。 - JohnGetFullPath
函数是基于当前目录计算绝对路径的,当前目录可能与 EXE 文件的位置相同也可能不同,并且在应用程序运行期间也可能会更改。 - Alexei Levenkov