.NET设置相对路径

时间:2008-11-12 14:17:30

标签: visual-studio configuration properties settings

我正在开发一个应用程序,其中有一个相对于我的应用程序根目录的图像文件夹。我希望能够在Properties - >中指定这个相对路径。设置设计师例如。 “\图片\”。我遇到的问题是在通过OpenFileDialog更改Environment.CurrentDirectory时,相对路径无法解析到正确的位置。有没有办法在Settings文件中指定一个路径,它意味着始终从应用程序目录而不是当前目录开始?我知道我总是可以动态地将应用程序路径连接到相对路径的前面,但我希望我的Settings属性能够自行解析。

6 个答案:

答案 0 :(得分:1)

据我所知,没有内置功能可以允许这种类型的路径解析。您最好的选择是动态确定执行目录的应用程序并将其连接到您的图像路径。由于您提到的原因,您不希望专门使用Environment.CurrentDirectory - 当前目录在这种情况下可能并不总是正确的。

我发现找到执行程序集位置的最安全的代码是:

public string ExecutingAssemblyPath()
{
   Assembly actualAssembly = Assembly.GetEntryAssembly();
   if (this.actualAssembly == null)
   {
      actualAssembly = Assembly.GetCallingAssembly();
   }
   return actualAssembly.Location;
}

答案 1 :(得分:1)

您在寻找Application.ExecutablePath吗?这应该告诉你应用程序的可执行文件在哪里,删除可执行文件名,然后将你的路径附加到它。

答案 2 :(得分:0)

2个选项:

  • 使用该设置的代码可以解析当前正在执行的程序集的目录的设置。
  • 您可以创建自己的类型,将其序列化为相对于正在执行的程序集的字符串,并具有将针对当前正在执行的程序集的目录解析的完整路径的访问者。

代码示例:

string absolutePath = Settings.Default.ImagePath;
if(!Path.IsPathRooted(absolutePath))
{
    string root = Assembly.GetEntryAssembly().Location;
    root = Path.GetDirectoryName(root);
    absolutePath = Path.Combine(root, absolutePath);
}

这段代码的优点在于它允许在您的设置中使用完全限定的路径或相对路径。如果您需要相对于不同装配的路径,则可以更改所使用的装配位置 - GetExecutingAssembly()将为您提供包含您正在运行的代码的装配位置,GetCallingAssembly()将如果选择2,那就好了。

答案 3 :(得分:0)

这似乎适用于WinForms和ASP.NET(提供配置文件的路径):

new System.IO.FileInfo(AppDomain.CurrentDomain.SetupInformation.ConfigurationFile).Directory;

对于Windows和控制台应用程序,显而易见的方法是使用:

Application.StartupPath

答案 4 :(得分:0)

I suggest you使用Assembly.CodeBase,如下所示:

public static string RealAssemblyFilePath()
{
   string dllPath=Assembly.GetExecutingAssembly().CodeBase.Substring(8);
   return dllPath;
}

您可以尝试Application.ExecutablePath。但是您需要引用System.Windows.Forms。如果您希望类库避开表单和UI内容,这可能不是一个好主意。

您可以尝试Assembly.GetExecutingAssembly().Location。但是,如果以某种方式在运行应用程序之前执行“卷影复制”(如默认的NUnit行为),则此属性将返回卷影副本位置,而不是真实的物理位置。

最好的方法是实现一个函数,该函数调用Assembly对象的CodeBase属性并切断字符串的不相关部分。

答案 5 :(得分:0)

我使用以下两种方法来帮助解决这个问题:

public static IEnumerable<DirectoryInfo> ParentDirs(this DirectoryInfo dir) {
    while (dir != null) {
        yield return dir;
        dir = dir.Parent;
    }
}
public static DirectoryInfo FindDataDir(string relpath, Assembly assembly) {
    return new FileInfo((assembly).Location)
        .Directory.ParentDirs()
        .Select(dir => Path.Combine(dir.FullName + @"\", relpath))
        .Where(Directory.Exists)
        .Select(path => new DirectoryInfo(path))
        .FirstOrDefault();
}

在开发期间,当各种构建脚本最终在bin\x64\Release\NonsensePath\等目录中粘贴内容时,查看父目录以便更容易使用的原因。