文件时放置文件的位置.Exists在类库中执行,但从MVC项目中调用

本文关键字:文件 执行 MVC 调用 项目 但从 Exists 位置 类库 | 更新日期: 2023-09-27 18:35:17

我有一个解决方案,它有两个表示层。一种是使用ASP。NET MVC、其他WinForms。这两个项目都依赖于第三个项目,它做一些业务逻辑,是一个类库。第三个项目有以下方法,在WinForms中运行良好,但在MVC中不起作用:

    public static string[] Dictionary()
    {
        if (_dictionary == null)
        {
            if (File.Exists("dict.txt"))
                _dictionary = File.ReadAllLines("dict.txt");
        }
        return _dictionary;
    }

因此,当我使用WinForms GUI时,文件是可以找到的,但当我使用MVC网站时,项目找不到它

构建解决方案时,dict.txt被放置在WinForms项目的bin/debug中。

它被放置在MVC项目的/bin中。

我应该把文件放在MVC项目的哪里?

文件时放置文件的位置.Exists在类库中执行,但从MVC项目中调用

您可以将它们放置在App_Data Forlder中,然后像以下一样引用它们

 var fileName = Path.Combine(System.Web.HttpContext.Current.Server.MapPath(@"~/App_Data"),"dict.txt");

因此,当我使用WinForms GUI时,文件是可以找到的,但当我使用MVC网站时,项目找不到它

要回答您观察到差异的原因,称为当前工作目录。默认情况下,当VS.NET启动Windows应用程序或控制台时,工作目录是相关的bin目录。

所有相对文件操作,如File.ReadAllLines("the.file"),将连接到一个绝对文件路径,如下所示。

Path.Combine(Directory.GetCurrentDirectory(), "the.file");

ASP。NET的工作目录将与web应用程序的根目录不相关。

我应该把文件放在MVC项目的哪里?

根据@dariogrifo的建议,它应该放在~/App_Data/*目录中。

我有一个解决方案,它有两个表示层。一种是使用ASP。NET MVC、其他WinForms。这两个项目都依赖于第三个项目,它做一些业务逻辑,是一个类库。

因此,现在您的当前实现和当前工作目录的实现方式有点棘手。在不深入研究太多细节的情况下,我建议代码找出如何间接加载文件,例如传递一个带有如下契约的接口。

public interface IDictionaryRepository {
    IEnumerable<string> LoadAllWords();
}

通过以上操作,您可以将业务逻辑更改为以下

public static string[] Dictionary()
{
    if (_dictionary == null)
    {
        _dictionary = _dictionaryRepository.LoadAllWords().ToArray();
    }
    return _dictionary;
}

上述抽象的好处是,您可以很容易地根据其他建议替换文件查找逻辑,还可以将字典迁移到某个数据库中。

服务器应用程序可以有两条路径——虚拟路径和逻辑路径。可以使用MapPath((方法引用其中一个或另一个。

服务器。MapPath("."(、服务器。MapPath("~"(,服务器。MapPath(@"''"(,服务器。MapPath("/"(。有什么区别?

我认为如果你需要在MVC中提供这个文件的完整路径,请查看:

Server.MapPath("~''bin''dict.txt")