![](/img/trans.png)
[英]File.Exists not working when application is run from NSIS installer
[英]Where to place files when File.Exists is executed in a class library but called from a MVC project?
我有一個具有兩個表示層的解決方案。 一種是使用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項目中的什么位置?
如@dariogriffo所建議,應將其放置在~/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;
}
上面的抽象的好處是,您可以輕松地按照其他建議輕松地替換文件查找邏輯,並且可以將字典遷移到托管在某個地方的數據庫中。
服務器應用程序可以具有2條路徑-虛擬路徑和邏輯路徑。 您可以使用MapPath()方法引用一個或另一個。
Server.MapPath(“。”),Server.MapPath(“〜”),Server.MapPath(@“ \\”),Server.MapPath(“ /”)。 有什么區別?
我想我需要在MVC中提供此文件的完整路徑,請查看以下內容:
Server.MapPath("~\\bin\\dict.txt")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.