С# чтение байтового массива из ресурса

Я пытался выяснить, как читать массив байтов из одного из моих файлов ресурсов, я пробовал самые популярные хиты в 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"));