C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

バイナリファイルのコピーを出力する方法

[トピック内 14 記事 (1 - 14 表示)]  << 0 >>

■83781 / inTopicNo.1)  バイナリファイルのコピーを出力する方法
  
□投稿者/ わっちょい (1回)-(2017/04/09(Sun) 19:05:40)

分類:[.NET 全般] 




EXEファイルからバイナリファイルを生成したいのですが
プロジェクトファイルにバイナリファイルをD&Dで取り込み、
そのファイルをそのまま指定したフォルダーに出力するにはどうしたら良いですか?

言語はVBです

よろしくお願いいたします。




引用返信 編集キー/
■83783 / inTopicNo.2)  Re[1]: バイナリファイルのコピーを出力する方法
□投稿者/ shu (1001回)-(2017/04/10(Mon) 08:01:42)
No83781 (わっちょい さん) に返信

> EXEファイルからバイナリファイルを生成したいのですが
EXEファイルはバイナリファイルですが、具体的にどういうことでしょうか?


> プロジェクトファイルにバイナリファイルをD&Dで取り込み、
プロジェクトファイルというのはVisual Studioのプロジェクトファイルのことでしょうか?
ファイルへのD&DというのはWindowsのエクスプローラ間でのことでしょうか?


> そのファイルをそのまま指定したフォルダーに出力するにはどうしたら良いですか?
どのファイルでしょう?プロジェクトファイル?EXEファイル?生成されたバイナリファイル?そのた?

> 言語はVBです
>
> よろしくお願いいたします。
出来ているとこまでの流れがわかる程度のコードを載せられたほうがよいと思います。
引用返信 編集キー/
■83786 / inTopicNo.3)  Re[2]: バイナリファイルのコピーを出力する方法
□投稿者/ furu (91回)-(2017/04/10(Mon) 10:01:58)
No83783 (shu さん) に返信

「リソース」を調べるといいと思います。
引用返信 編集キー/
■83787 / inTopicNo.4)  Re[1]: バイナリファイルのコピーを出力する方法
□投稿者/ 魔界の仮面弁士 (1248回)-(2017/04/10(Mon) 10:02:59)
2017/04/10(Mon) 11:32:16 編集(投稿者)

No83781 (わっちょい さん) に返信
> EXEファイルからバイナリファイルを生成したいのですが
> プロジェクトファイルにバイナリファイルをD&Dで取り込み、
> そのファイルをそのまま指定したフォルダーに出力するにはどうしたら良いですか?

プロジェクト内に追加したバイナリーファイルのプロパティで、
[出力ディレクトリにコピー]を何にしていますか?


デフォルトでは「コピーしない」になっていると思いますが、それを
「常にコピーする」または「新しい場合はコピーする」にしておけば、
ビルド時に EXE と同じフォルダーにコピーされますので、
追加のプログラムコードは不要になります。


ファイルとして配布するのではなく、EXE 内に埋め込んでおきたいのなら、
[My Project]の[リソース]タブで、バイナリファイルを埋め込むことができます。
このようにして埋め込まれたリソースは、
  Dim bin As Byte() = My.Resources.リソース名
で取り出せますので、
  System.IO.File.WriteAllBytes("C:\フォルダー\Example.dat", bin)
のようにしてファイルとして取り出せます。通常はこの方法をお奨めします。



あるいは、[My Project]の[リソース]タブではなく、プロジェクトに直接追加した上で、
そのバイナリーファイルのプロパティで、[ビルド アクション]を
「埋め込まれたリソース」にしているのであれば、下記のようにします。
ただ、リソースを埋め込むのであれば、上記の[My Project]を用いた方が扱いやすいでしょう。


Dim asm As System.Reflection.Assembly = System.Reflection.Assembly.GetExecutingAssembly()

'リソース名の一覧を取得
Dim names As String() = asm.GetManifestResourceNames()

'取り出すリソース名を指定
'リソース名が明らかな場合は、GetManifestResourceNames を呼ばずに直接指定しても OK
Dim name As String = names(0)

Using stm As System.IO.Stream = asm.GetManifestResourceStream(name), _
 outFile As New System.IO.StreamWriter("C:\フォルダー\Example.dat")
  stm.CopyTo(outFile.BaseStream)
  outFile.Flush()
  outFile.Close()
End Using

※.NET 4 未満の場合は、CopyTo の代わりに stm.Read と outFile.Write で代用
引用返信 編集キー/
■83788 / inTopicNo.5)  Re[3]: バイナリファイルのコピーを出力する方法
□投稿者/ わっちょい (3回)-(2017/04/10(Mon) 10:32:56)
No83786 (魔界の仮面弁士 さん) に返信

うまくいきました
完璧でした
感謝です

解決済み
引用返信 編集キー/
■83789 / inTopicNo.6)  Re[4]: バイナリファイルのコピーを出力する方法
□投稿者/ わっちょい (4回)-(2017/04/10(Mon) 10:39:36)
ちなみに

デフォルトの名前空間だと
WindowsApplication1.xxx.dat
のようになっていますが、
WindowsApplication1の部分だけを取得するにはどのようにしたら良いですか?
 
引用返信 編集キー/
■83790 / inTopicNo.7)  Re[5]: バイナリファイルのコピーを出力する方法
□投稿者/ 魔界の仮面弁士 (1249回)-(2017/04/10(Mon) 11:44:09)
No83789 (わっちょい さん) に返信
> デフォルトの名前空間だと
> WindowsApplication1.xxx.dat
> のようになっていますが、

これは、プロジェクトのプロパティを開いたときの
[アプリケーション]タブの [ルート名前空間] を示しています。

ルート名前空間が空欄なら、"xxx.dat" というリソース名となります。


> WindowsApplication1の部分だけを取得するにはどのようにしたら良いですか?

ルート名前空間の直下にあるクラス、たとえば Form1 などを利用して
 Dim rootNamespace As String = GetType(Form1).Namespace
といったコードで取得することはできます。
引用返信 編集キー/
■83791 / inTopicNo.8)  Re[6]: バイナリファイルのコピーを出力する方法
□投稿者/ わっちょい (5回)-(2017/04/10(Mon) 11:53:21)
ありがとうございます。

あと、一つだけ質問です

直接ファイル名を指定したとして
そのファイルが存在するかどうかはどのように判定したら良いですか?

File.Existsのようなコマンドはございますでしょうか?




引用返信 編集キー/
■83792 / inTopicNo.9)  Re[7]: バイナリファイルのコピーを出力する方法
□投稿者/ 魔界の仮面弁士 (1250回)-(2017/04/10(Mon) 12:36:08)
No83791 (わっちょい さん) に返信
> 直接ファイル名を指定したとして
> File.Existsのようなコマンドはございますでしょうか?

EXE 内の『リソース名』の有無をチェックするのではなく、
出力先の『ファイル』の有無をチェックするということですか?

前者(リソース名を列挙する方法)は既に述べていますので、仮に後者だとすれば、
System.IO.File.Exists メソッドや My.Computer.FileSystem.FileExists メソッドで
ファイルの存在を確認できます。
引用返信 編集キー/
■83793 / inTopicNo.10)  Re[7]: バイナリファイルのコピーを出力する方法
□投稿者/ kaina (26回)-(2017/04/10(Mon) 12:38:27)
あなたはご自分で調べる方法をご存じないのでしょうか?

以下のキーワードでgoogle等で調べたらすぐに出てくるのですが。。。

VB.net ファイル 存在確認
引用返信 編集キー/
■83794 / inTopicNo.11)  Re[8]: バイナリファイルのコピーを出力する方法
□投稿者/ わっちょい (6回)-(2017/04/10(Mon) 12:58:40)
No83792 (魔界の仮面弁士 さん) に返信

いえ、EXE 内の『リソース名』の有無をチェックする方法を教えてください。

列挙する方法は教えていただきましたが

例えば、
既にリソース名が分かっている場合で直接ファイル名を指定したいのですが
万が一のリソースが存在しない場合、エラーになってしまうので、
あらかじめのその指定したリソースが存在するか確認してから実行したいのですが

引用返信 編集キー/
■83795 / inTopicNo.12)  Re[9]: バイナリファイルのコピーを出力する方法
□投稿者/ 魔界の仮面弁士 (1251回)-(2017/04/10(Mon) 13:03:39)
2017/04/10(Mon) 13:06:39 編集(投稿者)

No83794 (わっちょい さん) に返信
> いえ、EXE 内の『リソース名』の有無をチェックする方法を教えてください。
> 列挙する方法は教えていただきましたが

列挙する方法が分かるなら、列挙した中にあるかどうかをループ処理で確認するだけでは?


そもそも、 No83787 で示したところの
『[My Project]の[リソース]タブを使う方法』を採用しているのか
『[ビルド アクション]の「埋め込まれたリソース」』を採用しているのかでも
処理方法が変わってきます。


『埋め込まれたリソース』の場合は、先のコードの Dim names As String() に
一覧が入っていますので、単純な For Each ループで存在チェックを行えます。
あるいは names.Contains の拡張メソッドや Array.FindIndex メソッドなりで
確認しても良いでしょう。


『リソース タブ』の場合は、"ルート名前空間.Resources" という名前のリソース内に
すべてまとめられていますので、その中を探索せねばなりませんが、これは
 Dim foundResource As Object = Nothing
 For Each entry As System.Collections.DictionaryEntry In My.Resources.ResourceManager.GetResourceSet(Application.CurrentCulture, True, True)
  If entry.Key = resourceName Then
   foundResource = entry.Value
   Exit For
  End If
 Next
のように、My.Resources.ResourceManager の GetResourceSet メソッドから
ResourceSet を列挙することで調査できます。
あるいはリフレクションで切り出しても良いでしょう。
引用返信 編集キー/
■83796 / inTopicNo.13)  Re[10]: バイナリファイルのコピーを出力する方法
□投稿者/ わっちょい (7回)-(2017/04/10(Mon) 13:07:21)
No83795 (魔界の仮面弁士 さん) に返信


『埋め込まれたリソース』の場合
の話です

File.Existsのような簡単なコマンドはなく
一度配列に読み込まないと確認できないということでしょうか_?

引用返信 編集キー/
■83797 / inTopicNo.14)  Re[11]: バイナリファイルのコピーを出力する方法
□投稿者/ 魔界の仮面弁士 (1252回)-(2017/04/10(Mon) 13:38:54)
No83796 (わっちょい さん) に返信
>> names.Contains の拡張メソッドや Array.FindIndex メソッドなりで
>> 確認しても良いでしょう。
> File.Existsのような簡単なコマンドはなく

Contains メソッドでもお気に召さなかったですか?
If asm.GetManifestResourceNames().Contains(resourceName) Then


こちらとしては、「やりたいこと」に対する「回答案」を出しているつもりでしたが、
それらの回答で目的を果たせないのであれば、せめて、何が問題となっているのかを
具体的な理由と共に明らかにしていただけないでしょうか。
理由無しで否定されると地味に凹みます。(^_^;)


コードが冗長だというなら、上記のように一行コードで足りるかと思いますし、
探索速度を問題視しているのなら、最初から変換テーブルを用意すれば済む話かと思います。
メモリ効率という話なら、そもそも内部リソースという選択がどうかと思いますし、仮に
パフォーマンスの問題だとしても、どの程度掛かっている処理をどの程度まで
縮めたいのかなど、『具体的』な問題点を出して頂けないでしょうか。

今のままですと後出しジャンケンの様相になってしまい、回答に詰まります……。


> 一度配列に読み込まないと確認できないということでしょうか_?

referencesource.microsoft.com も眺めてみましたが、名前の一覧を配列として返すメソッドと、
名前を指定してリソースを取り出すメソッドしか無さそうなんですよね。

他に選択肢があるとすれば、EXE 自身のメタデータを直接読むぐらいでは無いでしょうか。
その場合も、結局はリソーステーブルからのシーケンシャルな探索にしかならないと思いますが。
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ