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

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

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

リソースのタイムスタンプ取得方法

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

■95199 / inTopicNo.1)  リソースのタイムスタンプ取得方法
  
□投稿者/ とろろん (3回)-(2020/07/01(Wed) 02:27:43)

分類:[.NET 全般] 

お世話になっております。

当方VisiualStudioで開発を行っております。

あるプログラムで
埋め込みリソースに設定したイメージファイル(BMP)をプレビューするという処理を実装しました。

プログラムのテスト時、コンパイルされたイメージファイルが最新のものかを判断するため、
イメージファイル(BMP)のタイムスタンプをログ等で出力できればと考えておりました。

しかし、イメージファイル(BMP)自体にはタイムスタンプ等のファイル情報は保持していないため、
イメージファイル(BMP)のタイムスタンプ(最終更新日時)を取得することは不可能ではないかと考えております。
(イメージファイルは埋め込みリソースのためSystem.IO.File.GetLastWriteTimeとかでは取得できないです。。よね?)

そこで質問ですが
・イメージファイルのタイムスタンプ(最終更新日時)をどうにかして取得することは可能でしょうか?
・コンパイル時にリソースファイルの情報をどこかに保持して、実行時に保持したリソースファイルの情報を参照する方法はないでしょうか?

※そもそもリソースファイルは外だしにして、アセンブリとは別に管理する方法がよいのかもしれませんが、一旦上述の方法に絞って回答をお願いしたいです。

よろしくお願いいたします
引用返信 編集キー/
■95200 / inTopicNo.2)  Re[1]: リソースのタイムスタンプ取得方法
□投稿者/ WebSurfer (2076回)-(2020/07/01(Wed) 07:16:24)
No95199 (とろろん さん) に返信

投稿がダブっています。不要な方を削除願います。

> あるプログラムで

それはなんですか? 何を作っているのですか?

ASP.NET Web Forms のリソース埋め込みカスタムコントロール?

引用返信 編集キー/
■95201 / inTopicNo.3)  Re[2]: リソースのタイムスタンプ取得方法
□投稿者/ 774RR (801回)-(2020/07/01(Wed) 08:41:40)
その手のリソース管理は手でやるものぢゃ無くてソースコード管理ツールでするものだと思うっス。
git / Mercurial 等で「最新であること」を担保し、プログラマの負担は減らすのが吉。
タイムスタンプで管理しても、オイラの経験上は役に立たないっす(枝切って作業するときとか)
コミットハッシュ値のほうがよほど「使える」ですね。

引用返信 編集キー/
■95202 / inTopicNo.4)  Re[1]: リソースのタイムスタンプ取得方法
□投稿者/ kiku (185回)-(2020/07/01(Wed) 08:53:36)
No95199 (とろろん さん) に返信
> しかし、イメージファイル(BMP)自体にはタイムスタンプ等のファイル情報は保持していないため、
> イメージファイル(BMP)のタイムスタンプ(最終更新日時)を取得することは不可能ではないかと考えております。
> (イメージファイルは埋め込みリソースのためSystem.IO.File.GetLastWriteTimeとかでは取得できないです。。よね?)

タイムスタンプはOSが保持している情報で、
ファイル化されてはじめて付加される情報と認識しています。

よって、exeの中に埋め込まれたイメージはファイル化されていないので
タイムスタンプを持っていないということになります。
exeのタイムスタンプなら取得できると思います。

> そこで質問ですが
> ・イメージファイルのタイムスタンプ(最終更新日時)をどうにかして取得することは可能でしょうか?
> ・コンパイル時にリソースファイルの情報をどこかに保持して、実行時に保持したリソースファイルの情報を参照する方法はないでしょうか?

上述した通り、イメージのタイムスタンプは保持されていないので
入手は不可能かと思います。

代案として、タイムスタンプではありませんが、
イメージのハッシュ値を計算し、それをログに出力するというのはどうでしょうか?
これであれば、最新かどうかはわかりませんが、
思った通りのイメージかは判断できます。

ハッシュ値の計算方法は種類も多くいろいろありますが、
下記が参考になると思います。
https://dobon.net/vb/dotnet/string/filemd5.html

引用返信 編集キー/
■95203 / inTopicNo.5)  Re[2]: リソースのタイムスタンプ取得方法
□投稿者/ ぶなっぷ (226回)-(2020/07/01(Wed) 12:50:01)
直接の回答なら、みなさんのおっしゃっている通り不可能だと思います。
ただ、やりたいことは、こういうことじゃないですか?
「元になるBMPファイルとリソース内のBMPファイルが同一イメージであることを保証したい」

であれば、方法はあるかと。
ぱっと思いつく簡単な方法は、ビルド開始前のイベントにて、
BMPファイルをプロジェクト内の参照先にcopyしちゃう方法かな。

引用返信 編集キー/
■95283 / inTopicNo.6)  Re[3]: リソースのタイムスタンプ取得方法
□投稿者/ くまくま (5回)-(2020/07/10(Fri) 22:29:34)
ぶなっぷさんの意見に近い方法で

1.BMPファイル名を番号か日時を付けた名称とする。
「あああ0001.bmp」とか「いいい202007102225.bmp」
2.プレビューで表示する際ファイル名で番号(日時)が一番大きいものを使用する
「埋め込まれているリソースの名前を取得する」
https://dobon.net/vb/dotnet/programing/bitmapresource.html

いちいち番号(日時)を振るうのが面倒ならファイル名プログラムを作ってしまえばよい
(簡単ですから)
引用返信 編集キー/
■95288 / inTopicNo.7)  Re[4]: リソースのタイムスタンプ取得方法
□投稿者/ くまくま (10回)-(2020/07/11(Sat) 00:48:27)
No95283 (くまくま さん) に返信
> ぶなっぷさんの意見に近い方法で
> 
> 1.BMPファイル名を番号か日時を付けた名称とする。
> 「あああ0001.bmp」とか「いいい202007102225.bmp」
> 2.プレビューで表示する際ファイル名で番号(日時)が一番大きいものを使用する
> 「埋め込まれているリソースの名前を取得する」
> https://dobon.net/vb/dotnet/programing/bitmapresource.html
> 
> いちいち番号(日時)を振るうのが面倒ならファイル名プログラムを作ってしまえばよい
> (簡単ですから)
vbsの場合

Option Explicit

Dim nCnt
Dim oFS
Dim oF
Dim sFN

Set oFS = WScript.CreateObject("Scripting.FileSystemObject")

If WScript.Arguments.Count = 0 Then
    WScript.Quit(-1)
End If

For nCnt = 0 To WScript.Arguments.Count - 1
	Set oF = oFS.GetFile(WScript.Arguments(nCnt))
	sFN = Year(oF.DateLastModified)
	sFN = sFN & Right("0" & CStr(Month(oF.DateLastModified)), 2)
	sFN = sFN & Right("0" & CStr(Day(oF.DateLastModified)), 2)
	sFN = sFN & Right("0" & CStr(Hour(oF.DateLastModified)), 2)
	sFN = sFN & Right("0" & CStr(Minute(oF.DateLastModified)), 2)
	sFN = sFN & Right("0" & CStr(Second(oF.DateLastModified)), 2)
	sFN = oFS.getBaseName(oF.Name) & sFN & "." & oFS.GetExtensionName(oF.Name)
	oF.Name = sFN
Next

引用返信 編集キー/

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


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

このトピックに書きこむ