【问题标题】:Get File From an Assembly从程序集中获取文件
【发布时间】:2012-03-18 04:25:11
【问题描述】:

我想从下面的结构中读取一个文件路径

结构类似于:AssemblyName -> MyFiles (Folder) -> Text.txt

这里我要获取Text.txt的路径。请帮忙

【问题讨论】:

    标签: c#


    【解决方案1】:

    我认为您正在寻找的是嵌入程序集中的文件。查看this question。第一个答案解释了如何设置嵌入文件,以及如何从代码中获取。

    【讨论】:

      【解决方案2】:

      你可以的

      string assemblyPath = Assembly.GetExecutingAssembly().Location;
      string assemblyDirectory = Path.GetDirectoryName(assemblyPath);
      string textPath = Path.Combine(assemblyDirectory, "MyFiles", "Test.txt");
      string text = File.ReadAllText(textPath);
      

      ...只是将其拆分一些...但是您可以将其全部写在一行中,不用说...

      或者,如果您的 Environment.CurrentDirectory 已经设置为执行程序集所在位置的目录,您可以这样做

      File.ReadAllText(Path.Combine("MyFiles", "Text.txt"));
      

      【讨论】:

      • 我收到一个异常,“找不到路径的一部分 'c:\users\taks\documents\visual studio 2010\Projects\Console Applications\GetFilesFromAssembly\GetFilesFromAssembly\bin\Debug\我的文件\Test.txt'"
      • @JeffN825 我认为他有一个嵌入文件,而不是与程序集位于同一目录中的文件。
      • 如果文件位于库的文件夹而不是执行程序集的文件夹中,这将不起作用。除了嵌入式资源方法之外,我还没有找到适用于库子文件夹的方法。
      【解决方案3】:

      Jeff 已经介绍了您如何获得路径,如果您对他的回答的评论是您想要打开的文件实际上包含在您的项目输出中?

      在相关文件的属性窗格下查看Copy to Output Directory 选项 - 它通常默认为Do not copy。如果您想在编译程序的输出目录中包含一个文件,您需要将其设置为Copy AlwaysCopy if Newer

      作为一般说明,您应该始终将任何 IO 包装在适当的 try catch 块中,或使用静态 File.Exists(path) 方法来检查文件是否存在

      【讨论】:

      • 问题是我无法将此文件复制到输出目录,我必须从提到的层次结构中访问此文件。
      • 感谢 Eric 的建议,它正在工作,我已将其嵌入为资源
      • @user1238374,“提到的层次结构”是什么?您的第一个级别是“AssemblyName -> ”,每个人的理解都不同(程序集中的嵌入资源、相对于程序集的路径,甚至可能是相对于 GAC 中的程序集的路径),请澄清您的意思(以及您可能实际上 想要实现)。
      • @AlexeiLevenkov:程序集包含一个文件夹名称“MyFiles”,而该文件夹名称又包含一个文件名“Text.txt”。现在这个程序集将被另一个程序集引用,我必须在其中读取“Text.txt”文件的包含。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-02
      • 1970-01-01
      • 1970-01-01
      • 2010-10-28
      • 2013-10-27
      • 1970-01-01
      相关资源
      最近更新 更多