文件时放置文件的位置.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项目的哪里?
您可以将它们放置在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")