Re: 【バグ?】パスワード付きDXアーカイブにoggファイルがあると正常に読み込めない ( No.1 ) |
- 名前:管理人 日時:2020/08/14 23:48
手元で
test.ogg
Test1.bmp
だけが入ったフォルダをパスワード TestPass でDXアーカイブ化して
以下のようなDXアーカイブ内の oggファイルと bmpファイルを読み込んで
音の再生・画像の描画を行うプログラムを組んで実行してみましたが、
正常に音の再生・画像の描画が行われました
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int GrHandle ;
int SoundHandle ;
// ウィンドウモードで起動
ChangeWindowMode( TRUE ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
return -1 ;
}
// DXアーカイブのパスワードを設定
SetDXArchiveKeyString( "TestPass" ) ;
// oggファイルの読み込み・再生
SoundHandle = LoadSoundMem( "TestDXA\\test.ogg" ) ;
PlaySoundMem( SoundHandle, DX_PLAYTYPE_NORMAL ) ;
// bmpファイルの読み込み・描画
GrHandle = LoadGraph( "TestDXA\\Test1.bmp" ) ;
DrawGraph( 0, 0, GrHandle, TRUE ) ;
// キー入力待ちをする
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
よろしければ正常に読み込めなかった際のDXアーカイブ内の詳細な
ファイル構成を教えていただけないでしょうか? m(_ _)m
|
Re: 【バグ?】パスワード付きDXアーカイブにoggファイルがあると正常に読み込めない ( No.2 ) |
- 名前:was-blue.0793 日時:2020/08/15 16:36
>>管理人さん
DXアーカイブには、oggファイルと独自拡張子のテキストファイル4つが入っていました。
DXアーカイブ内のファイルの一覧をFileRead_FindFirst関数で取得しようとしましたが、oggファイルが含まれるDXアーカイブのファイルの一覧を正常に取得できません。
直接ファイルを指定した場合に読み込めるかまでは確認していなかったため、こちらの環境で読み込めるかは後ほど確認します。
|
Re: 【バグ?】パスワード付きDXアーカイブにoggファイルがあると正常に読み込めない ( No.3 ) |
- 名前:was-blue.0793 日時:2020/08/15 20:19
先の返信に追記です。
直接DXアーカイブに入っているoggファイルを指定した場合は読み込むことができました。
しかしFileRead_FindFirst関数を使う場合、なおoggファイルが含まれているDXアーカイブのファイルの中に入っているファイルをすべて読み取らなくなる模様です。
※実際のバグと思われる挙動とタイトルが異なるため、タイトルを変更しました
|
Re: 【バグ?】パスワード付きDXアーカイブにoggファイルがあるとFileRead_FindFirstでファイル取得できない ( No.4 ) |
- 名前:管理人 日時:2020/08/16 00:06
私も手元のDXアーカイブファイルの中身を
test.ogg
Test1.bmp
TextFile1.str
TextFile2.str
TextFile3.str
TextFile4.str
という、独自拡張子のテキストファイル4つと oggファイルを含めて
前回と同じくパスワード TestPass としたうえで、以下のように FileRead_FindFirst と
FileRead_FindNext を使用してファイルの一覧を表示するプログラムを実行してみましたが、
正常に画面にファイルの一覧が表示されました
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
DWORD_PTR FindHandle ;
FILEINFO FindData ;
int FileCount = 0 ;
// ウィンドウモードで起動
ChangeWindowMode( TRUE ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
return -1 ;
}
// DXアーカイブのパスワードを設定
SetDXArchiveKeyString( "TestPass" ) ;
// DXアーカイブ内のファイル一覧の最初のファイルの情報を取得
FindHandle = FileRead_findFirst( "TestDXA\\*.*", &FindData ) ;
// ファイルの情報の取得に成功したか判定
if( FindHandle != ( DWORD_PTR )-1 )
{
int Result = 0 ;
// 検索対象のファイル名を全て表示する
do
{
DrawString( 0, FileCount * 16, FindData.Name, GetColor( 255, 255, 255 ) ) ;
FileCount ++ ;
Result = FileRead_findNext( FindHandle, &FindData ) ;
}while( Result != -1 ) ;
}
// 検索情報ハンドルの後始末
FileRead_findClose( FindHandle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
よろしければ上記のようなシンプルなであれば was-blue.0793さんが作成されたDXアーカイブ内の
ファイルも FileRead_FindFirst で問題なくファイル名が取得できるかお試しいただけないでしょうか? m(_ _)m
|
Re: 【バグ?】パスワード付きDXアーカイブにoggファイルがあるとFileRead_FindFirstでファイル取得できない ( No.5 ) |
- 名前:was-blue.0793 日時:2020/08/16 01:21
>>管理人さん
当該プログラム及びサンプルプログラムで確認を進めていたところ、以下のことがわかりました。
なお、フォルダ構造は以下のようになっています。(実際の環境はフォルダ内にいくつかのファイルがありますが、このフォルダ構造でも再現可能です)
Parent(フォルダ)
├Children1(DXアーカイブ)
│└Grandchild1.ogg
├Children2(DXアーカイブ)
│└Grandchild2.ogg
└Children2(フォルダ)
└Grandchild3.ogg
1.Parentから検索を開始する場合、Children1のGrandchild1.oggは取得できない。(同じディレクトリに同名フォルダがないとファイルを検索できない)
2.Parentから検索を開始する場合、Children2のGrandchlid2.oggは取得できる。この時DXアーカイブが優先されGrandchild3.oggは読み取れない。(同じディレクトリに同名フォルダがあるとファイルを検索できる。DXアーカイブがある場合はDXアーカイブ優先)
3.直接Children1から検索を開始する場合、Children1のGrandchild1.oggは取得できる。(直接DXアーカイブを指定すればファイルを検索できる)
4.1の状況下でローカルWindowsデバッガーで調査したところ、DXアーカイブファイルは「DirFlag」が「0」(フォルダではない)となっていた。
上記のことから、恐らく1つ以上上のディレクトリから検索を開始する場合、同名フォルダが存在しないとDXアーカイブをディレクトリとして認識しなくなるものと思われます。
また、実際の環境ではDXアーカイブの拡張子を変更しパスワードも設定していますが、2の状況からSetDxArchiveExtensionとSetDxArchiveKeyStringの設定ミスではないものと思われます。
|
Re: 【バグ?】パスワード付きDXアーカイブにoggファイルがあるとFileRead_FindFirstでファイル取得できない ( No.6 ) |
- 名前:管理人 日時:2020/08/17 23:00
なるほど、複数のDXアーカイブと通常のフォルダが混在した状態でのお話だったのですね
> 1.Parentから検索を開始する場合、Children1のGrandchild1.oggは取得できない。(同じディレクトリに同名フォルダがないとファイルを検索できない)
FileRead_FindFirst では検索対象のフォルダ内にDXアーカイブがあった場合、それをフォルダではなく
ファイルとして返しますので、単純に was-blue.0793さんの検索プログラムではDXアーカイブの中を
検索対象とされていないのだと思います
> 2.Parentから検索を開始する場合、Children2のGrandchlid2.oggは取得できる。この時DXアーカイブが優先されGrandchild3.oggは読み取れない。(同じディレクトリに同名フォルダがあるとファイルを検索できる。DXアーカイブがある場合はDXアーカイブ優先)
DXアーカイブはファイルとして扱われますが、同名のフォルダがあった場合はフォルダの中を
検索しようとする、ただ、DXアーカイブの方が優先されるため、
DXアーカイブ内の Grandchild2.ogg が検出される、という事だと思います
DXアーカイブと同名の通常のフォルダが存在した場合、片方しか検索対象となりませんので、
Grandchild3.ogg が検出されないのは仕様となります
> 4.1の状況下でローカルWindowsデバッガーで調査したところ、DXアーカイブファイルは「DirFlag」が「0」(フォルダではない)となっていた。
前述の通り、FileRead_FindFirst で検索対象としたフォルダ内にDXアーカイブが存在した場合、
DXアーカイブをフォルダではなくファイルとして返すようになっていますので、仕様となります
> 上記のことから、恐らく1つ以上上のディレクトリから検索を開始する場合、同名フォルダが存在しないとDXアーカイブをディレクトリとして認識しなくなるものと思われます。
いえ、DXアーカイブと同名のフォルダが存在していてもDXアーカイブをディレクトリとしては扱いません、
単に同名のフォルダの中を検索しようとして、同名のDXアーカイブの中を検索しているだけです
FileRead_FindFirst で検索対象としたフォルダ内に存在するDXアーカイブをフォルダとして扱うのは
容易なのですが、Children2.dxa というDXアーカイブと Children2 というフォルダが存在した場合、
同名のフォルダが二つ存在することになってしまうので、少しややこしいです…
申し訳ありませんが、拡張子がDXアーカイブのものだった場合は DirFlag が 0 でもフォルダとして扱う、
という処理を行っていただけますでしょうか? m(_ _;m
|
Re: 【バグ?】パスワード付きDXアーカイブにoggファイルがあるとFileRead_FindFirstでファイル取得できない ( No.7 ) |
- 名前:was-blue.0793(解決) 日時:2020/08/18 00:11
>>管理人さん
当該プログラムでは確かにDXアーカイブをディレクトリとして扱うかの判定は行っていませんでした。
他のDXライブラリのアプリへの移植性に懸念は残りますが、現状はDXアーカイブの拡張子を検索関数に渡し強制的にディレクトリ扱いする処理を追加することにします。
ご対応ありがとうございました。
|