Как встроить текстовый файл в сборку .NET? - PullRequest
115 голосов
/ 11 января 2009

Я хотел бы встроить текстовый файл в сборку, чтобы я мог загрузить текст, не считывая его с диска, и чтобы все, что мне нужно, содержалось в исполняемом файле. (Чтобы он был более портативным)

Есть ли способ сделать это? Я предполагаю что-то с файлами ресурсов?

А если можете, как вы это делаете и как программно загружаете текст в строку?

Ответы [ 7 ]

142 голосов
/ 11 января 2009

Щелкните правой кнопкой мыши файл проекта, выберите «Свойства».

В открывшемся окне перейдите на вкладку Ресурсы, и если у нее есть просто синяя ссылка в середине вкладки, щелкните ее, чтобы создать новый ресурс.

enter image description here

Затем на панели инструментов над вкладкой выберите новый текстовый файл, дайте ему имя, он будет добавлен в ваш проект и открыт.

Если вы зашли так далеко, то в своем коде вы можете ввести Resources.TheNameYouGaveTheTextFileHere и получить доступ к его содержимому. Обратите внимание, что в первый раз, когда вы используете класс Resources в классе, вам нужно добавить директиву using (нажмите Ctrl +. После ввода ресурсов, чтобы открыть меню, чтобы заставить VS делать это за вас).

Если что-то неясно в приведенном выше описании, пожалуйста, оставьте комментарий, и я буду редактировать его до тех пор, пока оно не будет завершено или не будет иметь смысла:)

38 голосов
/ 11 января 2009

В Visual Studio 2003, Visual Studio 2005 и, возможно, более ранних версиях (это работает и в 2008 году) вы можете включить текстовый файл в свой проект, а затем на панели «Свойства» установить действие «Встроенный ресурс». Затем вы можете получить доступ к файлу в виде потока, используя Assembly.GetManifestResourceStream(string).

Другие ответы здесь более удобны. Я включил это для полноты.

Обратите внимание, что этот подход будет работать для встраивания других типов файлов, таких как изображения, значки, звуки и т. Д. *

30 голосов
/ 02 июля 2012

После встраивания текстового файла используйте этот файл в любом месте кода, подобного этому ...

global::packageName.Properties.Resources.ThatFileName
4 голосов
/ 11 января 2009

Да, вы правы - создайте файл ресурсов. Когда вы делаете это, вам не нужно «загружать» строку, на нее будет ссылаться как Resource.WhwhatStringYouDefined.

1 голос
/ 24 октября 2018

Вот что сработало для меня. (Мне нужно было прочитать содержимое файла, встроенного в исполняемый файл образа .NET.)

Прежде чем что-либо делать, включите свой файл в решение в Visual Studio. (В моем случае VS 2017 Community.) Я переключился на Solution Explorer, затем щелкнул правой кнопкой мыши папку Properties, выбрал Add Existing Item и выбрал файл. (Скажем, FileName.txt.) Затем, находясь в Solution Explorer, щелкните правой кнопкой мыши на включенном файле, выберите Properties и выберите Build Action как Embedded Resource.

Затем используйте этот код для чтения его байтов:

string strResourceName = "FileName.txt";

Assembly asm = Assembly.GetExecutingAssembly();
using( Stream rsrcStream = asm.GetManifestResourceStream(asm.GetName().Name + ".Properties." + strResourceName))
{
    using (StreamReader sRdr = new StreamReader(rsrcStream))
    {
        //For instance, gets it as text
        string strTxt = sRdr.ReadToEnd();
    }
}

Обратите внимание, что в этом случае вам не нужно добавлять этот файл в качестве ресурса, как это было предложено в принятом ответе .

1 голос
/ 12 апреля 2018

Вот что я сделал:

  1. Добавлены мои файлы (ресурсы) в Visual Studio, щелкнув правой кнопкой мыши по проекту.
  2. Щелкните правой кнопкой мыши по каждому добавленному файлу и измените «Тип сборки» на «Встроенный ресурс».
  3. Для доступа к ресурсу:

    а. Получил текущую сборку с помощью функции: GetExecutingAssembly()

    б. Ресурс, который я добавил, был текстовым файлом, поэтому я прочитал его в поток, используя GetManifestResourceStream(fileName). Я получил доступ к именам файлов, позвонив по номеру GetManifestResourceNames()

    с. Теперь используйте класс StreamReader() для чтения в конец файла переменной, если вы этого хотите.

0 голосов
/ 18 апреля 2018

Добавление к ответу Павана для получения текущей сборки (в общем разделе):

Assembly _assembly;

GetManifestResourceStream (fileName) (в коде, где требуется чтение из ресурса):

try
{
    _assembly = Assembly.GetExecutingAssembly();
    _textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("*Namespace*.*FileName*.txt"));
}
catch
{
    Console.WritelLine("Error accessing resource!");
}
...