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ライブラリの範疇内で「/」が正常動作しない場合は、まずは「\」で試してみましょう。
--------------------------------------------------------------------------------------
ということですね(^^)
この度は皆様ありがとうございました。
管理人様の丁寧なご対応にも改めて感謝いたします。
|