9

为什么文件路径为空?关于如何获取相对文件路径的任何想法?

internal sealed class Configuration : DbMigrationsConfiguration<MvcProject.Models.FileDb>
{
    public Configuration()
    {
        // code here is not relevant to question
    }
    protected override void Seed(MvcProject.Models.FileDb context)
    {    
        string filePath = System.Web.HttpContext.Current.Server.MapPath("~/Content/File.txt");

        // read File.txt using filePath and update the database
    }
}

我在 ASP .NET MVC 项目上设置实体框架时创建的 Migrations 文件夹中的 Configuration.cs 文件中有上述代码

当我在包管理器控制台中运行“Update-Database -Verbose”时,我收到一个错误,即 filePath 为空。

如果我使用文件的绝对 URL 手动设置 filePath:

string filePath = "C:/Users/User1/My Documents/Visual Studio 2012/Projects/MvcProject/Content/File.txt";

一切正常。

显然,目标是有一个相对路径,以便在不同的设置上与不同的开发人员合作。

说实话,我需要的只是文件——不一定是路径。任何帮助将不胜感激。

4

2 回答 2

25

我使用这个函数来映射 Seed 方法中的路径,不是很干净,但它可以工作:

private string MapPath(string seedFile)
{
    if(HttpContext.Current!=null)
        return HostingEnvironment.MapPath(seedFile);

    var absolutePath = new Uri(Assembly.GetExecutingAssembly().CodeBase).LocalPath; //was AbsolutePath but didn't work with spaces according to comments
    var directoryName = Path.GetDirectoryName(absolutePath);
    var path = Path.Combine(directoryName, ".." + seedFile.TrimStart('~').Replace('/','\\'));

    return path;
}

然后只需使用以下命令调用它:

   using (var streamReader = new StreamReader(MapPath("~/Data/MyFile.csv")))
于 2013-11-19T11:35:26.087 回答
0

正如我所说,我相信你从一个页面调用它并且它System.Web.HttpContext.Current是空的,因为MapPath函数永远不会返回带有非空输入的空 - 所以你会在那里得到一个异常。

试试那个替代方案:

string filePath = HttpRuntime.AppDomainAppPath + "/Content/File.txt";

或者

string filePath = HostingEnvironment.MapPath("~/Content/File.txt");

相关问题:如何在线程或定时器中访问 HttpServerUtility.MapPath 方法?

于 2013-04-28T09:00:45.243 回答