web-dev-qa-db-ja.com

c#リソースからバイト配列を読み取る

私は自分のリソースファイルの1つからバイト配列を読み取る方法を見つけようとしてきましたが、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();

ただし、このファイルをアプリケーションのリソースとして保存したいので、プログラムに追加のファイルを同梱する必要はありません。

このファイルは、私のプログラムの一部が使用する暗号化されたデータを保持しています。

どんな助けやポインタも大歓迎です!

14
Raskaroth

アセンブリにリソースとして埋め込まれているファイルについて話していると仮定します。

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
}
18
Darin Dimitrov

プロジェクトのプロパティの[リソース]タブ(必要に応じて作成)、[リソースの追加](既存のファイル)に移動して、アプリケーションにリソースを追加できます。ファイルが追加されたら、そのFileType(プロパティ内)をBinaryに設定できます。

ドキュメント

その後、byte []としてファイルに簡単にアクセスできます。

var myByteArray = Properties.Resources.MyFile;
15
Panos

streamResourceInfoを使用してみることができます。これはSilverlightの例へのリンクですが、私が間違っていなければ、どの.NETアプリケーションにも同じ原則を適用できるはずです。

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

よろしく、
Anders @ Cureos

0

この目的で使用している小さなクラスは次のとおりです。

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
ladenedge
var rm = new ResourceManager("RessourceFile", typeof(ClassXY).Assembly);
return Encoding.UTF8.GetBytes(rm.GetString("key"));
0