トップページ > 記事閲覧
ファイルパスのディレクトリ階層の区切りについて
名前:Ketty 日時: 2014/07/31 00:49

管理人様 いつも楽しくDXライブラリを使用させていただいております。 LoadGraphのファイルパスの指定方法について質問させてください。 質問@  まず、画像ファイルへのパスの階層区切りは、  「\」円マーク(プログラム内では「\\」円マーク円マーク)でも、  「/」スラッシュでも、どちらでもよい、という認識で合ってますでしょうか? 質問A  私はこれまで、上記@の答えは、Yesだと勝手に解釈していたのですが、  「/」スラッシュでは正常にロードできないケースがありました。  「\」円マーク指定(プログラム内では「\\」円マーク円マーク)だと、ハンドルが正常な値(-1以外)を返し、  「/」スラッシュ指定だと、ハンドルが必ず-1になります。  (具体的な再現手順は最後に示します。)  これは、DXライブラリのなんらかの不具合でしょうか?  それとも環境の問題、あるいは、私の実装誤りでしょうか? 質問B  上記AがYesの場合ですが、  LoadGraph以外の関数で、同様のケース、  あるいは逆のケース(「\」円マークが駄目になるケース)はあるのでしょうか? <環境や再現ソースなど> 【環境】   OS:Windows7 Home Edition 64bit   開発環境:Visual C++ 2010 Express   DXライブラリのバージョン:3.12a 【補足】   過去の質問から、DXライブラリではサポートされないはずのアニメーションGIFが、   DXライブラリの動画関数で扱えるように読み取れたので、その実験をするために作ったものです。   コメントアウトしているLoadGraphの3か所を変えていただけると事象が確認できます。   なお、今回の質問は、GIFをサポートしてほしいという要望ではありません。   また、私の環境では、「\」円マーク指定でやるとアニメーションGIFが再生できます。 【出典】   ttp://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=past&no=2788 【ソース】 /////////////////////////////////////////////////// // 動画のハンドル int Handle ; // DXライブラリのログ出力をしない DxLib::SetOutApplicationLogValidFlag( FALSE ) ; // ウィンドウモードで起動 DxLib::ChangeWindowMode( TRUE ) ; // 画面モード設定 DxLib::SetGraphMode( 640, 480, 32 ) ; // DXライブラリ初期化処理 if( DxLib::DxLib_Init() == -1 ){ return -1 ; } // 動画(アニメーションGIF画像)をロード Handle = DxLib::LoadGraph( "IMG\\test.gif" ) ; // ○ gifに対して円マークで指定すると正常にハンドルが取れる //Handle = DxLib::LoadGraph( "IMG/test.gif" ) ; // × gifに対してスラッシュで指定すると必ず-1が返る模様 //Handle = DxLib::LoadGraph( "IMG/test.png" ) ; // ○ pngならスラッシュでも正常にハンドルが取れる // 動画(アニメーションGIF画像)を再生 DxLib::PlayMovieToGraph( Handle ) ; // メインループ(ESCで終了) while( DxLib::ProcessMessage() == 0 && DxLib::CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) { // 画面クリア DxLib::ClsDrawScreen(); // 動画を描画 DxLib::DrawGraph( 100, 100, Handle, FALSE ) ; // しばらく待つ Sleep( 10 ) ; } // DXライブラリ終了処理 DxLib::DxLib_End() ; // ソフトの終了 return 0 ; ///////////////////////////////////////////////////
メンテ

Page: 1 |

Re: ファイルパスのディレクトリ階層の区切りについて ( No.1 )
名前:管理人 日時:2014/08/02 20:26

ご報告ありがとうございます DXライブラリではGIFファイルを含む動画ファイルの読み込みに DirectShow を 使用しているのですが、何故か GIFファイルだけファイルパスのフォルダの区切りに / が使用されていると読み込みが失敗するみたいです ( WMVファイルでは問題なく読み込めました ) DirectShow にファイルパスを渡す前に / を \ に置き換えるようにしたら 正常に読み込めるようになりましたので、よろしければこちらの修正版をお試しください m(_ _;m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_DevCppTest.exe // Dev-C++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_MinGWTest.exe // MinGW 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibDotNet.zip // .NET用 http://homepage2.nifty.com/natupaji/DxLib/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい) ご質問の回答は以下の通りです > 質問@ 合っています > 質問A GIF画像限定でフォルダの区切りに / が使用されていると読み込みに失敗するようです DirectShow の GIFコーデック限定の仕様かもしれません > 質問B ファイル読み込みをDXライブラリのプログラムで行っていないのは DirectShow を 使用する場合のみなので、今回の修正版以降では他のファイル読み込み機能で同様の 現象が発生するということは無いと思います
メンテ
Re: ファイルパスのディレクトリ階層の区切りについて ( No.2 )
名前:Ketty 日時:2014/08/02 21:16

管理人様 お忙しい中、非情に迅速なご対応に感謝いたしますm(__)m ご提供いただいた修正版(VisualC++ 用)にて、 「/」スラッシュでもGIFファイルを正常にロードできることを確認いたしました。 取り急ぎ、その旨ご報告させていただきます。 ありがとうございました。 なるほど、今回の事象は、DirectShow + GIF限定の仕様かもしれないということですか。 以下は、一応お伝えしたくなったことです。 私は、DirectShowのことはおろか、DirectXの仕様自体さっぱり分からないので、差支えない程度にお読みくだされば幸いです。 過去の経験から、今回の現象に似たものを目にしたことを思い出しました。 それは、Win32APIのSHCreateDirectoryExというディレクトリ作成関数なのですが、 この関数が、今回に似た現象(「\」円マークならOKで「/」スラッシュならNG)が起こったことがあります。 いままで忘れていました。 そのとき私もスラッシュを円マークにすることで対応した記憶だけあります。 (1〜2年くらい前のことなので、たぶんいまも再現すると思いますが、すみません手元で実験してませんm(__)m) なので、もしかすると、DirextShowというよりも、 Win32API、もしくはWindowsレベルでこういった不具合(仕様?)を内包しているのではないかと懸念します。
メンテ
Re: ファイルパスのディレクトリ階層の区切りについて ( No.3 )
名前:Will 日時:2014/08/05 12:03

Windowsでのパス区切り文字は「バックスラッシュ」なので、スラッシュを使うべきではありません。 UNIXへの互換性のため?なのかスラッシュをパス区切り文字としても使用できますが、 スラッシュはパラメータ(/?とか)文字として使用するため、パラメータを持つAPI等を使用する場合、 意図しない動作となることがあります。 例えば dir c:\temp は正しく動作しますが dir c:/temp は失敗します。 つまり、質問@は「いいえ」が正しいです。
メンテ
Re: ファイルパスのディレクトリ階層の区切りについて ( No.4 )
名前:Ketty 日時:2014/08/05 19:50

Willさん ご回答くださり、ありがとうございますm(__)m >Windowsでのパス区切り文字は「バックスラッシュ」なので、スラッシュを使うべきではありません。 なんと…やはり、そうだったんですか…。 それは、msdnとかで周知されていることなのでしょうか? よろしければURLなどご存知でしたら教えていただけませんか。 (正式にはこれだよ、という文献をみつけることができず困っております。) 以下ではスラッシュもOKだと読み取れ、 http://itdoc.hitachi.co.jp/manuals/3020/30203S3530/JPAS0040.HTM http://wダブリューw.ipa.go.jp/security/awareness/vendor/programmingv1/b08_01.html 以下では、スラッシュは駄目なケースがあると読み取れます。 http://okwave.jp/qa/q3168002.html いずれも、公式文書ではないので参考程度にしかならないのですが。 (投稿禁止文字に該当したため、一部文字を変更しています) >つまり、質問@は「いいえ」が正しいです。 いまのところ、私の中では、 どうやらスラッシュは使わないのがよい、と結論付けられそうなのですが、 そうであるとすれば、今回、管理人様に実施していただいた修正は、 誤り(修正前があるべき姿)だったのかな、と危惧しております。
メンテ
Re: ファイルパスのディレクトリ階層の区切りについて ( No.5 )
名前:管理人 日時:2014/08/05 22:51

頑張って英語の msdn のファイルパスについてのページを読んでみたのですが http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx ディレクトリの区切りはバックスラッシュ( 日本語文字で言うところの \ )である、と書かれています あと、Windowsではスラッシュ( / ) を バックスラッシュ( \ )に変換する、というような記述もあるような気がします とりあえず、ディレクトリの区切りに / を使うのは非推奨だということは分かりました ただ、Windows の API である CreateFile や SetCurrentDirectory もディレクトリの区切りに / を使用しても 問題なく動作するので、DXライブラリでもその仕様に準拠しようと思います なので質問@の私なりの回答を改めてしますと ・「\」と「/」のどちらもで動作しますが、Windows は「/」を使用することは推奨していませんので、  特別な理由が無い限りは「\」を使用すべき(のよう)です となります
メンテ
Re: ファイルパスのディレクトリ階層の区切りについて ( No.6 )
名前:sss 日時:2014/08/06 00:27

Windows APIは「/」「\」のどちらも有効で Shell APIは「\」のみだと、どこかで見た記憶があります。 まぁ、悩んだら「\」を使っとけば安心かと^^
メンテ
Re: ファイルパスのディレクトリ階層の区切りについて ( No.7 )
名前:Will 日時:2014/08/06 09:54

スラッシュを使用するのであればパスをダブルコーテーションで囲むと良いようです。 dir "c:/temp" であれば正しく動作します。 私の方で実行できる環境が無いので試せませんが、以下のように記述すれば修正前ソフトでもロードできないでしょうか? Handle = DxLib::LoadGraph( "\"IMG/test.gif\"" ) ;
メンテ
Re: ファイルパスのディレクトリ階層の区切りについて ( No.8 )
名前:Ketty 日時:2014/08/06 20:12

管理人様  お忙しい中、ご回答くださりありがとうございます。  msdnまで調べていただきまして感謝いたしますm(__)m >ただ、Windows の API である CreateFile や SetCurrentDirectory もディレクトリの区切りに / を使用しても >問題なく動作するので、DXライブラリでもその仕様に準拠しようと思います なるほど、分かりやすいです。ありがとうございます。 sss様  ご助言くださり、ありがとうございます。 >まぁ、悩んだら「\」を使っとけば安心かと^^ そうですね。管理人さんもおっしゃるとおり、特別な理由が無い限りは「\」を使うようにしようと思います。 Will様  私の環境で実験してみたところ(修正前DXライブラリに戻して)、  ご提示いただいたパス指定でもロード失敗することが分かりました。 -------------------------------------------------------------------------------------- ということで、一応まとめさせていただきますと、 DXライブラリの仕様としては、「\」でも「/」でもOKという方向で統一してくださる。 しかし、DXライブラリの範疇外の部分に関しては、「\」で統一するのが安全で、 また、万が一DXライブラリの範疇内で「/」が正常動作しない場合は、まずは「\」で試してみましょう。 -------------------------------------------------------------------------------------- ということですね(^^) この度は皆様ありがとうございました。 管理人様の丁寧なご対応にも改めて感謝いたします。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存