簡體   English   中英

當在類庫中執行File.Exists但從MVC項目中調用File.Exists時,文件應該放在哪里?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM