Как встроить текстовый файл в сборку.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.
Вот что я сделал:
- Добавил мои файлы (ресурсы) в Visual Studio, щелкнув правой кнопкой мыши по проекту.
- Щелкните правой кнопкой мыши по каждому добавленному вами файлу и измените "Тип сборки" на "Встроенный ресурс".
Для доступа к ресурсу:
а. Получил текущую сборку используя функцию:
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!");
}