Добавить файл в ресурсы, а затем извлечь его
Хочу сделать, чтобы пользователь мог добавить файл в ресурсы программы, а затем была возможность извлечь его. С обеими задачи по отдельности я вроде как справилась, извлечь ресурс можно с помощью кода:
File.WriteAllBytes("test.sql", <Название проекта>.Properties.Resources.test);
Где Resources.test - нужный ресурс, а "test.sql" файл на диске.
Для добавления я взяла пример кода с документации Microsoft:
// Get the image as an array of bytes.
FileStream byteStream = new FileStream("AppIcon.jpg", FileMode.Open);
Byte[] bytes = new Byte[(int) byteStream.Length];
byteStream.Read(bytes, 0, (int) byteStream.Length);
// Create the resource file.
using (ResourceWriter rw = new ResourceWriter(@".\UIImages.resources"))
{
rw.AddResource("AppIcon", byteStream);
// Add any other resources.
}
Так как в примере работа с байтами, то можно вместо .jpg использовать другой формат, например .sql или .exe.
Так вот у меня два вопроса: подойдёт ли этот метод с документации Microsoft для добавления любого формата файла? И основной вопрос, который я не смогла решить - как можно извлечь записанный ресурс? Ведь используя метод, который я приводила в пример выше:
File.WriteAllBytes("test.sql", <Название проекта>.Properties.Resources.test);
нужно указывать путь к ресурсу Properties.Resources.<ресурс>, но так как ресурса в программе ещё нет, то я не знаю, как правильно это сделать. Возможно есть другие методы добавления / извлечения ресурсов, которые позволяют это сделать. И возможно ли это сделать на С#? Первый пример, который приходит в голову, доказывающий, что это в принципе возможно, - обфускаторы кода, ведь в них ты указываешь файл, затем происходит его обфускация и на выходе мы получаем новый файл. Возможно я что-то не так понимаю и в них используется другая логика, углублённо в этой теме я не разбираюсь. Также я нашла код изменения уже добавленного файла ресурсов:
string ResxFile = File.ReadAllText("Properties/Resources.resx");
string wordResxName = resxname;
string word = resxvalue;
string ResxAddStrings = " <data name=\"" + wordResxName + "\" xml:space=\"preserve\">\r\n <value>" + word + "</value>\r\n </data>\r\n";
ResxAddStrings += "</root>";
File.WriteAllText("Properties/Resources.resx", ResxFile);
Со статьями 1, 2, и 3 я уже ознакомилась. Также долгое время искала ответ на свой вопрос в сети, но ответа на него не нашла. Возможно вы знаете что-то по этой теме и подскажете мне?
Ответы (1 шт):
Можно извлечь конкретный ресурс по имени, используя класс System.Resources.ResXResourceSet . Метод ResourceSet.GetString(String) извлекает значение именованного строкового ресурса. Метод ResourceSet.GetObject(String) извлекает значение именованного объекта или двоичные данные. Этот метод возвращает объект, который затем должен быть приведен (в C#) или преобразован (в Visual Basic) в объект нужного типа.