С# чтение байтового массива из ресурса
Я пытался выяснить, как читать массив байтов из одного из моих файлов ресурсов, я пробовал самые популярные хиты в Google без явного успеха.
У меня есть файл, хранящийся в коллекции ресурсов моей программы, я бы хотел прочитать этот файл как массив байтов
В настоящее время я просто читаю файл из корневого каталога моей программы со следующим кодом:
FileStream fs = new FileStream(Path, FileMode.Open);
BinaryReader br = new BinaryReader(fs);
byte[] bin = br.ReadBytes(Convert.ToInt32(fs.Length));
fs.Close();
br.Close();
Однако я хочу сохранить этот файл в качестве ресурса в своем приложении, так что мне не нужно отправлять дополнительный файл с моей программой.
В этом файле хранятся зашифрованные данные, используемые частью моей программы.
Любая помощь или указатели будут очень благодарны!
Ответы
Ответ 1
Предполагая, что вы говорите о файлах, которые встроены в качестве ресурсов в вашей сборке:
var assembly = System.Reflection.Assembly.GetExecutingAssembly();
using (var stream = assembly.GetManifestResourceStream("SomeNamespace.somefile.png"))
{
byte[] buffer = new byte[stream.Length];
stream.Read(buffer, 0, buffer.Length);
// TODO: use the buffer that was read
}
Ответ 2
Вы можете добавить ресурсы в свое приложение, перейдя в свойства проекта, вкладку "Ресурсы" (при необходимости создайте), Добавить ресурс (существующий файл). Когда ваш файл добавлен, вы можете установить его FileType (по своим свойствам) в двоичный файл.
Документация
После этого вы можете легко получить доступ к своему файлу в виде байта []:
var myByteArray = Properties.Resources.MyFile;
Ответ 3
возможно, вы можете попробовать использовать StreamResourceInfo. Вот ссылка на пример Silverlight, но если я не ошибаюсь, вы должны иметь возможность применять одни и те же принципы в любом приложении .NET:
http://msdn.microsoft.com/en-us/library/system.windows.resources.streamresourceinfo(v=VS.95).aspx
С уважением,
Anders @Cureos
Ответ 4
Вот небольшой класс, который мы используем для этой цели:
static class EmbeddedResource
{
/// <summary>
/// Extracts an embedded file out of a given assembly.
/// </summary>
/// <param name="assemblyName">The namespace of your assembly.</param>
/// <param name="fileName">The name of the file to extract.</param>
/// <returns>A stream containing the file data.</returns>
public static Stream Open(string assemblyName, string fileName)
{
var asm = Assembly.Load(assemblyName);
var stream = asm.GetManifestResourceStream(assemblyName + "." + fileName);
if (stream == null)
throw new ConfigurationErrorsException(String.Format(
Strings.MissingResourceErrorFormat, fileName, assemblyName));
return stream;
}
}
Использование довольно просто:
using (var stream = EmbeddedResource.Open("Assembly.Name", "ResourceName"))
// do stuff
Ответ 5
var rm = new ResourceManager("RessourceFile", typeof(ClassXY).Assembly);
return Encoding.UTF8.GetBytes(rm.GetString("key"));