【问题标题】:How should I organize project-specific read-only files in c#我应该如何在 c# 中组织项目特定的只读文件
【发布时间】:2009-07-30 23:11:18
【问题描述】:

我的独立小型 C# 项目需要中等数量(约 100 个)的 (XML) 文件,这些文件需要在运行时提供特定于域的值。它们不需要对用户可见。但是我需要偶尔添加或更新它们,我准备手动执行(即我不设想特定工具,特别是因为它们可能是在系统外部创建的)。

我希望它们是可重定位的(即使用相对文件名)。我应该考虑哪些选项来组织它们?打开和阅读它们需要哪些调用?

该项目本质上是独立的(与 Web 服务、数据库或其他第三方应用程序无关)。它被组织成少量的命名空间,文件的所有逻辑都可以限制在一个命名空间中。

========= 我很抱歉不清楚。我会再试一次。在 Java 应用程序中,可以包含相对于类路径读取的资源文件,而不是最终的 *.exe。我相信有一种方法可以在 C# 中做类似的事情。

========= 我相信我应该使用与 RESX 相关的东西。请参阅(RESX 文件和 xml 数据https://stackoverflow.com/posts/1205872/edit)。我可以将字符串放在 resx 文件中,但这很繁琐且容易出错,我希望将它们复制到适当的位置。

很抱歉不清楚,但我不太确定如何提问。

========= 这个问题似乎非常接近(C# equivalent of getClassLoader().getResourceAsStream(...))。我希望能够在 VisualStudio 中添加文件 - 我的问题是我将它们放在哪里以及如何指示它们是资源?

【问题讨论】:

  • C# 项目意味着很多东西 - 服务、Web 项目、win 项目等。请更具体。
  • 谢谢 - 我试图澄清范围

标签: c# file organization


【解决方案1】:

如果您将它们放在相对于您的可执行文件的子文件夹中,例如.\Config,您将能够使用File.ReadAllText(@"Config\filename.xml") 访问它们。

如果您有一个 ASP.NET 应用程序,您可以将它们放在特殊的 App_Data 文件夹中并使用 File.ReadAllText(Server.MapPath("~/App_Data/filename.xml")) 访问它们

【讨论】:

    【解决方案2】:

    我仍然不清楚您是否有 Win 表单或 Web 项目...无论如何,使用相对文件名不需要使它们可重定位。我建议在 web.config 或 app.config 文件的 appSettings 部分添加一个条目,其中包含 xml 文件的完整路径。如果它们被移动,您所要做的就是更改您的配置文件。

    <!-- app/web.config --->
    <appSettings>
            <add key="filelocation" value="c:\xmlfiles"/>
    </appSettings>
    
    //c# code (in ASP.NET app, for example)
    using System.IO;
    using System.Xml.Linq;
    
    public partial class _Default : System.Web.UI.Page 
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            string path = ConfigurationManager.AppSettings["filelocation"];
            DirectoryInfo di = new DirectoryInfo(path);
            List<XDocument> xmlDocs = new List<XDocument>();
            foreach (FileInfo fi in di.GetFiles())
            {
                xmlDocs.Add(XDocument.Load(fi.FullName));
            }
        }
    }
    

    当然,您可能知道也可能不知道 xml 文件名,因此您可能不会以完全相同的方式加载和阅读它们。

    在您的情况下,如果您有一个 ASP.NET 站点(假设它永远不会在多个服务器上),将它们放在您的 App_Data 文件夹中似乎是完全合适的。请注意,如果您在配置文件中列出“~/App_Data”,您知道会将其转换为完整路径,就像 darin 对 Server.MapPath() 所做的那样。

    【讨论】:

      【解决方案3】:

      http://www.attilan.com/2006/08/accessing_embedded_resources_u.php上有详细解答。看来该文件必须指定为 EmbeddedResource。我还没有让它工作,但这是我想要的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-13
        相关资源
        最近更新 更多