トップページ > 過去ログ > 記事閲覧
アーカイブの事
名前:meigin 日時: 2007/04/29 10:37

アーカイブで変換したファイルやフォルダのアドレスをどうやって獲得すればいいのでしょうか?   画像フォルダがあって、その中にあるファイル、フォルダを獲得して全ての画像を読み込むと言った具合です。   アーカイブにしてしまうと、フォルダ名やファイル名の獲得が出来なくなり読み込めなくなってしまうのです。   こんな感じの関数と同じ様な事をする方法はないのでしょうか?   void ReadingPicture(const char *name, fpFunc func){ WIN32_FIND_DATA lp; HANDLE hFind = FindFirstFile(name, &lp); if(hFind == INVALID_HANDLE_VALUE){ return; } std::string Pattern = name; { int size = (int)Pattern.size(); Pattern.resize(size - 1); } do{ if((lp.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && strcmp(lp.cFileName,"..") && strcmp(lp.cFileName,".")){ //subpathでディレクトリのフルパスが分かる std::string sub = Pattern; sub += lp.cFileName; sub += "/*"; // ホルダの中のホルダ ReadingPicture(sub.c_str(), func); } if((lp.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != FILE_ATTRIBUTE_DIRECTORY ){ // 拡張子の識別 if(PathMatchSpec( lp.cFileName, "*.bmp") || PathMatchSpec( lp.cFileName, "*.png") || PathMatchSpec( lp.cFileName, "*.jpg")){ std::string sub = Pattern; sub += lp.cFileName; // 指定の関数へ振り分け (*(func))(lp.cFileName, LoadGraph( sub.c_str() )); } } } while(FindNextFile(hFind, &lp)); FindClose(hFind); }

Page: 1 |

Re: アーカイブの事 ( No.1 )
名前:A 日時:2007/04/30 16:30

 DxArchiveはソースがクラスとして公開されているので、アーカイブ内のファイル名を取得できるはずです。  それを使用してラッパー関数を作れば同じことが出来そうです。
Re: アーカイブの事 ( No.2 )
名前:管理人 日時:2007/05/06 11:32

 meiginさんどうも、DXライブラリの管理人です。  返信が遅くなり申し訳ありません。  とりあえずアーカイブをフォルダに見立てながら FindFirstFile と同等の 処理を行う関数を追加しましたので、宜しければこちらをダウンロードして下さい。m(_ _)m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe //VC用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe //BCC用 (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』、VCをお使いの場合は『リビルド』をして下さい)  追加した関数は以下の関数です。 //戻り値 -1:エラー -1以外:ファイル検索ハンドル int FileRead_findFirst( const char *FilePath, FILEINFO *Buffer ); //戻り値 -1:エラー 0:成功 int FileRead_findNext( int FindHandle, FILEINFO *Buffer ); //戻り値 -1:エラー 0:成功 int FileRead_findClose( int FindHandle );  何れも FindFirstFile, FindNextFile, FindClose のアーカイブファイル対応版と お考え下さい。(引数の型や戻り値が違いますが・・・)  なお、WIN32_FIND_DATA の代わりに FILEINFO という構造体でファイルの情報を取得します。 // ファイル情報構造体 struct FILEINFO { char Name[MAX_PATH] ; // オブジェクト名 int DirFlag ; // ディレクトリかどうか( TRUE:ディレクトリ FALSE:ファイル ) LONGLONG Size ; // サイズ DATEDATA CreationTime ; // 作成時刻 DATEDATA LastWriteTime ; // 最終更新時刻 };  ディレクトリかどうかを判断する場合は DirFlag が TRUE かどうかを調べます。  というわけで、meiginさんがお書き込みになったプログラムを上記関数を使用する形に 変更すると次のようになります。 void ReadingPicture(const char *name, fpFunc func){ FILEINFO lp; int hFind = FileRead_findFirst(name, &lp); if(hFind == -1){ return; } std::string Pattern = name; { int size = (int)Pattern.size(); Pattern.resize(size - 1); } do{ if((lp.DirFlag == TRUE) && strcmp(lp.Name,"..") && strcmp(lp.Name,".")){ //subpathでディレクトリのフルパスが分かる std::string sub = Pattern; sub += lp.Name; sub += "/*"; // ホルダの中のホルダ ReadingPicture(sub.c_str(), func); } if(lp.DirFlag == FALSE){ // 拡張子の識別 if(PathMatchSpec( lp.Name, "*.bmp") || PathMatchSpec( lp.Name, "*.png") || PathMatchSpec( lp.Name, "*.jpg")){ std::string sub = Pattern; sub += lp.Name; // 指定の関数へ振り分け (*(func))(lp.Name, LoadGraph( sub.c_str() )); } } } while(FileRead_findNext(hFind, &lp) == 0); FileRead_findClose(hFind); }  不明な点がございましたらお訊き下さい。m(_ _)m
Re: アーカイブの事 ( No.3 )
名前:meigin 日時:2007/05/06 10:22

有り難う御座います 上手く行きました
Re: アーカイブの事 ( No.4 )
名前:meigin 日時:2007/05/06 15:12

fscanfの代わりになる関数が無いですね。 そう言う機能を持つ関数を作ればいいのですが、 どうやって作ればいいのか検討が付かないんです。 今考えているのは テキスト>バイナリに変換>アーカイブ化 という手順を踏むわけです。 バイナリに変換を忘れてアーカイブ化してしまうと、 読み込み時に失敗してしまいます。   バイナリのファイルがゴミになってしまうような気もするのです。 また修正などで変換するとなると面倒ですよね。  
Re: アーカイブの事 ( No.5 )
名前:管理人 日時:2007/05/14 00:55

 meiginさんどうも、DXライブラリの管理人です。  ご指摘の通り fscanf に代わる FileRead_系の関数がありませんでしたので 追加しました。宜しければこちらのバージョンをダウンロードして下さい。m(_ _)m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe //VC用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe //BCC用 (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』、VCをお使いの場合は『リビルド』をして下さい)  追加した関数は以下の関数です。 // ファイルから書式化されたデータを読み出す int FileRead_scanf( int FileHandle, const char *Format, ... ) ;  使い方は fscanf と同じです。 %ls と %lc 以外の機能と、%f で取得できる浮動小数点値が fscanf よりも 若干精度が下がるということを除いてはリファレンスから読み取れる限りの 機能を実装したつもりですが、如何せん組み合わせが多く、完全には 動作テストが出来ていない状態です。  思うように動作しなかったり、fscanf と挙動が違う点などありましたら ご連絡ください。m(_ _)m
Re: アーカイブの事 ( No.6 )
名前:meigin 日時:2007/05/14 10:23

忙しい時にすみません。   while(FileRead_scanf(FileHandle, "%s", fileName) != EOF){ // 色々な処理 } と言った感じで最後まで読み込む処理をしているのですが、無限ループしてしまいます。 返り値が常に1です。 (アーカイブは試してません、テキストからの読み込みです)   文字列のs[30]とか、確保しますよね。 テキストに30以上の配列が必要な文字列が書かれていた場合はどうなるんでしょうか?
Re: アーカイブの事 ( No.7 )
名前:Will 日時:2007/05/14 12:05

>文字列のs[30]とか、確保しますよね。 >テキストに30以上の配列が必要な文字列が書かれていた場合はどうなるんでしょうか? fscanfと同じ動きをするのであればバッファオーバーランするのではないでしょうか。 通常、fscanfでも%sを指定する場合、"%29s"というようにオーバーフローしないようにバッファサイをズ指定する使い方が安全であると思います。
Re: アーカイブの事 ( No.8 )
名前:meigin 日時:2007/05/14 15:30

Willさん、有り難う御座います。 初心者の本には、そんな指定する事が書かれてないので、どうなっているのかなと気になりまして。  
Re: アーカイブの事 ( No.9 )
名前:管理人 日時:2007/05/15 11:37

 meiginさんどうも、DXライブラリの管理人です。 > while(FileRead_scanf(FileHandle, "%s", fileName) != EOF){ > // 色々な処理 > } > と言った感じで最後まで読み込む処理をしているのですが、無限ループしてしまいます。   すみません、基本的な仕様を見落としていました。m(_ _;m 修正したバージョンをアップしましたので、宜しければ再度お試しになってみて下さい。 http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe //VC用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe //BCC用 (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』、VCをお使いの場合は『リビルド』をして下さい)
Re: アーカイブの事 ( No.10 )
名前:meigin 日時:2007/05/15 14:08

上手く行きました。   アーカイブ化しての読込も成功です。 忙しい中、対応して頂き有り難う御座います。

Page: 1 |