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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.83781 の関連記事表示

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

    分類:[.NET 全般] 




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

    言語はVBです

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



親記事 /過去ログ143より / 関連記事表示
削除チェック/

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

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


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


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

    > 言語はVBです
    >
    > よろしくお願いいたします。
    出来ているとこまでの流れがわかる程度のコードを載せられたほうがよいと思います。
記事No.83781 のレス /過去ログ143より / 関連記事表示
削除チェック/

■83787  Re[1]: バイナリファイルのコピーを出力する方法
□投稿者/ 魔界の仮面弁士 -(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 で代用
記事No.83781 のレス /過去ログ143より / 関連記事表示
削除チェック/

■83786  Re[2]: バイナリファイルのコピーを出力する方法
□投稿者/ furu -(2017/04/10(Mon) 10:01:58)
    No83783 (shu さん) に返信

    「リソース」を調べるといいと思います。
記事No.83781 のレス /過去ログ143より / 関連記事表示
削除チェック/

■83788  Re[3]: バイナリファイルのコピーを出力する方法
□投稿者/ わっちょい -(2017/04/10(Mon) 10:32:56)
    No83786 (魔界の仮面弁士 さん) に返信

    うまくいきました
    完璧でした
    感謝です
記事No.83781 のレス / END /過去ログ143より / 関連記事表示
削除チェック/

■83789  Re[4]: バイナリファイルのコピーを出力する方法
□投稿者/ わっちょい -(2017/04/10(Mon) 10:39:36)
    ちなみに

    デフォルトの名前空間だと
    WindowsApplication1.xxx.dat
    のようになっていますが、
    WindowsApplication1の部分だけを取得するにはどのようにしたら良いですか?
     
記事No.83781 のレス /過去ログ143より / 関連記事表示
削除チェック/

■83790  Re[5]: バイナリファイルのコピーを出力する方法
□投稿者/ 魔界の仮面弁士 -(2017/04/10(Mon) 11:44:09)
    No83789 (わっちょい さん) に返信
    > デフォルトの名前空間だと
    > WindowsApplication1.xxx.dat
    > のようになっていますが、

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

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


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

    ルート名前空間の直下にあるクラス、たとえば Form1 などを利用して
     Dim rootNamespace As String = GetType(Form1).Namespace
    といったコードで取得することはできます。
記事No.83781 のレス /過去ログ143より / 関連記事表示
削除チェック/

■83791  Re[6]: バイナリファイルのコピーを出力する方法
□投稿者/ わっちょい -(2017/04/10(Mon) 11:53:21)
    ありがとうございます。

    あと、一つだけ質問です

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

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



記事No.83781 のレス /過去ログ143より / 関連記事表示
削除チェック/

■83793  Re[7]: バイナリファイルのコピーを出力する方法
□投稿者/ kaina -(2017/04/10(Mon) 12:38:27)
    あなたはご自分で調べる方法をご存じないのでしょうか?

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

    VB.net ファイル 存在確認
記事No.83781 のレス /過去ログ143より / 関連記事表示
削除チェック/

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

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

    前者(リソース名を列挙する方法)は既に述べていますので、仮に後者だとすれば、
    System.IO.File.Exists メソッドや My.Computer.FileSystem.FileExists メソッドで
    ファイルの存在を確認できます。
記事No.83781 のレス /過去ログ143より / 関連記事表示
削除チェック/

■83794  Re[8]: バイナリファイルのコピーを出力する方法
□投稿者/ わっちょい -(2017/04/10(Mon) 12:58:40)
    No83792 (魔界の仮面弁士 さん) に返信

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

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

    例えば、
    既にリソース名が分かっている場合で直接ファイル名を指定したいのですが
    万が一のリソースが存在しない場合、エラーになってしまうので、
    あらかじめのその指定したリソースが存在するか確認してから実行したいのですが
記事No.83781 のレス /過去ログ143より / 関連記事表示
削除チェック/

■83795  Re[9]: バイナリファイルのコピーを出力する方法
□投稿者/ 魔界の仮面弁士 -(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 を列挙することで調査できます。
    あるいはリフレクションで切り出しても良いでしょう。
記事No.83781 のレス /過去ログ143より / 関連記事表示
削除チェック/

■83796  Re[10]: バイナリファイルのコピーを出力する方法
□投稿者/ わっちょい -(2017/04/10(Mon) 13:07:21)
    No83795 (魔界の仮面弁士 さん) に返信


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

    File.Existsのような簡単なコマンドはなく
    一度配列に読み込まないと確認できないということでしょうか_?
記事No.83781 のレス /過去ログ143より / 関連記事表示
削除チェック/

■83797  Re[11]: バイナリファイルのコピーを出力する方法
□投稿者/ 魔界の仮面弁士 -(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 自身のメタデータを直接読むぐらいでは無いでしょうか。
    その場合も、結局はリソーステーブルからのシーケンシャルな探索にしかならないと思いますが。
記事No.83781 のレス /過去ログ143より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -