Як вставити текстовий файл у збірку .NET?


118

Я хотів би вставити текстовий файл у збірку, щоб я міг завантажувати текст, не маючи для цього читати його з диска, і щоб все, що мені потрібно, містилось у програмі exe. (Так що це більш портативно)

Чи є спосіб це зробити? Я припускаю щось із файлами ресурсів?

І якщо можете, як це зробити і як ви програмно завантажуєте текст у рядок?

Відповіді:


147

Клацніть файл проекту правою кнопкою миші та виберіть Властивості.

У вікні, що відкриється, перейдіть на вкладку "Ресурси", і якщо на ній просто синє посилання посередині сторінки вкладки, натисніть на неї, щоб створити новий ресурс.

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

Потім на панелі інструментів над вкладкою виберіть, щоб додати новий текстовий файл, дайте йому ім’я, він буде доданий у ваш проект та відкритий.

Якщо ви досягли цього далеко, то у своєму коді ви можете ввести Resources.TheNameYouGaveTheTextFileHere, і ви можете отримати доступ до його вмісту. Зауважте, що при першому використанні класу Resources в класі вам потрібно додати директиву використання (натисніть Ctrl +. Після введення Resources, щоб отримати меню, щоб отримати VS для вас).

Якщо щось з цим описом було незрозумілим, залиште коментар, і я редагую його, поки він не буде повним чи не має сенсу :)


1
Як би виглядав код директиви "використання", я намагаюся зробити цю роботу. Я додав solutions.txt як ресурс, але він не може знайти Resources.solutions - я вважаю, що мені не вистачає директиви щодо використання.
Шпег

3
А-ха-ха, все, що мені потрібно було зробити, - це додати Мій. на фронт (тобто My.Resources.solutions) Simples!
Шпон

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

1
Якщо я додати текстовий файл таким чином і скажу, що текстовий файл є частиною мого рішення ... якщо цей файл оновлюється, і я відновлю збірку, чи вбудований ресурс також оновиться? Або мені потрібно буде вручну видалити / повторно додати файл, якщо я коли-небудь його зміню?
Пітер Тіррелл

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

38

У Visual Studio 2003, Visual Studio 2005 та, можливо, більш ранніх версіях (це працює і в 2008 році) ви можете включити текстовий файл у свій проект, потім на панелі "Властивості" встановити дію на "Вбудований ресурс". Потім ви можете отримати доступ до файлу як потік, використовуючи Assembly.GetManifestResourceStream(string).

Інші відповіді тут зручніші. Я включаю це для повноти.

Зауважте, що такий підхід буде працювати для вбудовування файлів інших типів, таких як зображення, піктограми, звуки тощо ...


8
Примітка. Використовуйте простір імен + ім'я файлу як параметр для GetManifestResourceStream (), наприклад, "MyNamespace.MyTextfile.txt". Ви також можете зателефонувати GetManifestResourceNames (), щоб отримати список усіх імен.
Штіфель

32

Після вбудовування текстового файлу використовуйте цей файл будь-де в коді, як цей ...

global::packageName.Properties.Resources.ThatFileName

3
Це набагато кращий підхід, оскільки він видасть помилку компілятора, якщо ресурс буде видалений. Це також усуває помилки друку. Дякую за пост.
Бен Гріпка

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

1
Що робити, якщо я хочу вказати ThatFileNameзі змінної?
c00000fd

4

Так, ви праві - створіть файл ресурсу. Коли ви зробите це, вам не потрібно "завантажувати" рядок, вона буде посилатися як Resource.WeverStringYouDefined.


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()

    c. Тепер використовуйте 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.