C#如何调用文件相对地址而不是绝对地址

时间:2016-05-15 16:44:13

标签: c# file

我发现自己不得不依赖必须使用一些本地文件夹。通常没问题,但主要问题是如果将项目转移到另一台机器,即使在开发期间,结构也会报告错误。

错误是当我从文件中读取时,页面无法在本地网站上显示,并且出现IO错误。

目录如下

C:\Users\Keith\OneDrive\Documents\Project 2016\Lingerie\Lingerie\Corset\Corset

有问题的文件夹是

  • Master Audio
  • 图片
  • 用户音频

File Location

他们使用的实际文件夹

private String folderPlay = @"C:\Users\Keith\OneDrive\Documents\Project 2016\Lingerie\Lingerie\Corset\Corset\Master Audio\";
private String folderRecord = @"C:\Users\Keith\OneDrive\Documents\Project 2016\Lingerie\Lingerie\Corset\Corset\User Audio\";
private String folderImages = @"C:\Users\Keith\OneDrive\Documents\Project 2016\Lingerie\Lingerie\Corset\Corset\Images\";

我想做的是能够相对于代码调用这些文件吗?如果不是太麻烦,可以附上一个小纸条,这样我就能理解/

2 个答案:

答案 0 :(得分:1)

仅使用项目中的路径而不是整个物理路径

private String folderPlay = @"~/Master Audio";
private String folderRecord = @"~/User Audio";
private String folderImages = @"~/Images";

我的建议是使用Master_AudioUser_Audio之类的路径。不要在单词之间留出空格

答案 1 :(得分:0)

我发现在类似情况下有用的是实际将内容根目录注入需要知道特定资源位置的类:

E.g。

class Foo{

    private string readonly _contentRoot;

    public Foo (string contentRoot)
    {
        _contentRoot = contentRoot
    }

    public void DoSomethingWithImage()
    {
        string imgRelativePath = "/img/img1.png";
        string imgPath = Path.Combine(_contentRoot, imgRelativePath);

        // do something with imgPath        
    }
}

这样做的好处是您现在可以为您的方法编写测试(否则可能很难)。有时,单元测试框架会将库复制到临时位置,但您仍然希望运行测试。

您可以从多个位置解析根目录,具体取决于您运行代码的方式:

  • 对于单元测试,请使用Assembly.GetExecutingAssembly().GetName().CodeBase
  • 适用于网络应用HttpRuntimeHttpContext
  • 适用于Windows应用AppDomain.BaseDirectory或类似的

经验法则:

  • 你不应该有任何硬编码的绝对路径(测试时疼痛,在另一台机器上运行,部署)
  • 相反,使用相对路径(通常相对于项目根目录或根目录/内容)