c # чтение байтового массива из ресурса - PullRequest
12 голосов
/ 27 сентября 2011

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

Однако я хочу сохранить этот файл как ресурс в своем приложении, чтобы мне не приходилось отправлять дополнительный файл с моей программой.

Этот файл содержит зашифрованные данные, которые использует часть моей программы.

Любая помощь или указатели будут с благодарностью!

Ответы [ 5 ]

18 голосов
/ 27 сентября 2011

Предполагается, что вы говорите о файлах, которые встроены в сборку как ресурсы:

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
}
15 голосов
/ 27 сентября 2011

Вы можете добавить ресурсы в свое приложение, перейдя в свойствах проекта, на вкладку «Ресурсы» (создайте один при необходимости), Добавить ресурс (существующий файл). Когда ваш файл добавлен, вы можете установить для его FileType (в его свойствах) значение Binary.

Документация

После этого вы можете легко получить доступ к вашему файлу в виде байта []:

var myByteArray = Properties.Resources.MyFile;
0 голосов
/ 13 декабря 2012
var rm = new ResourceManager("RessourceFile", typeof(ClassXY).Assembly);
return Encoding.UTF8.GetBytes(rm.GetString("key"));
0 голосов
/ 27 сентября 2011

Вот небольшой класс, который мы используем для этой цели:

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
0 голосов
/ 27 сентября 2011

возможно, вы можете попробовать использовать StreamResourceInfo.Вот ссылка на пример Silverlight, но если я не ошибаюсь, вы сможете применить те же принципы в любом приложении .NET:

http://msdn.microsoft.com/en-us/library/system.windows.resources.streamresourceinfo(v=VS.95).aspx

С уважением,
Андерс @ Cureos

...