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


118

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

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

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

Ответы:


147

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

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

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

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

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

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


1
Как бы выглядел код директивы using, я изо всех сил пытаюсь заставить это работать. Я добавил solutions.txt в качестве ресурса, но он не может найти Resources.solutions - мне кажется, мне не хватает директивы using.
Spedge,

3
Ага, все, что мне нужно было сделать, это добавить My. на передний план (т.е. My.Resources.solutions) Простые!
Spedge,

2
Добавление ресурса генерирует и включает в себя Properties\Resources.Designer.csс namespace YourProjectRootNamespace.Properties, так что вы должны использовать YourProjectRootNamespace.Properties. ProjectRootNamespaceопределяется в свойствах вашего проекта в VisualStudio.
ilyaigpetrov 09

1
Если я добавлю текстовый файл таким образом и скажу, что текстовый файл является частью моего решения ... если этот файл будет обновлен, и я перестрою сборку, будет ли обновлен встроенный ресурс? Или мне нужно будет вручную удалить / повторно добавить файл, если я когда-нибудь его изменю?
Питер Тиррелл

3
Файлы упаковываются в ресурсы во время компиляции, а не при их добавлении. Вы можете свободно изменять файл в любом инструменте, который вам нравится, и перестраивать, изменения будут частью вашей сборки.
Лассе В. Карлсен

38

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

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

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


8
Примечание. Используйте пространство имен + имя файла в качестве параметра для GetManifestResourceStream (), например «MyNamespace.MyTextfile.txt». Вы также можете вызвать GetManifestResourceNames (), чтобы получить список всех имен.
Stiefel

32

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

global::packageName.Properties.Resources.ThatFileName

3
Это гораздо лучший подход, поскольку при удалении ресурса возникает ошибка компилятора. Это также устраняет опечатки. Спасибо за сообщение.
Бен Грипка,

+5. Могу ли я записать его обратно в файл на уровне C # DLL?
Праджвал Бхат,

1
Что, если я хочу указать ThatFileNameпеременную?
c00000fd

4

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


2

Вот что у меня сработало. (Мне нужно было прочитать содержимое файла, встроенного в исполняемый файл образа .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

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

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

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

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

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


0

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

Assembly _assembly;

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

try
{
    _assembly = Assembly.GetExecutingAssembly();
    _textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("*Namespace*.*FileName*.txt"));
}
catch
{
    Console.WritelLine("Error accessing resource!");
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.