Как встроить текстовый файл в сборку.NET?

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

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

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

7 ответов

Решение

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

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

введите описание изображения здесь

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

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

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

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

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

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

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

global::packageName.Properties.Resources.ThatFileName

Вот что сработало для меня. (Мне нужно было прочитать содержимое файла, встроенного в исполняемый файл образа.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() + ".Properties." + strResourceName))
{
    using (StreamReader sRdr = new StreamReader(rsrcStream))
    {
        //For instance, gets it as text
        string strTxt = sRdr.ReadToEnd();
    }
}

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

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

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

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

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

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

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

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

Assembly _assembly;

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

try
{
    _assembly = Assembly.GetExecutingAssembly();
    _textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("*Namespace*.*FileName*.txt"));
}
catch
{
    Console.WritelLine("Error accessing resource!");
}
Другие вопросы по тегам