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

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

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

Re[7]: CFileFindとCFile::GetStatus()


(過去ログ 119 を表示中)

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

■70008 / inTopicNo.1)  CFileFindとCFile::GetStatus()
  
□投稿者/ nobb (1回)-(2014/02/17(Mon) 16:04:29)

分類:[C/C++] 

とあるシステムのバージョンアップの為、昔書かれたC++(MFC)のプログラムを見ていて疑問に思った事が有りましたので投稿します。

私はMFCでファイルの存在判定を行うする際は「CFileFindクラス」を使用するようにしていますが、
その昔書かれたソースではGetStatus関数で判定しているようなのです。
例:
 CFileStatus status;
 if(CFile::GetStatus(path, status)
 {
  //何か処理
  //statusは未使用
 }

これは何かメリットがあるのでしょうか?

#そんな事しらねーよ!開発者(or ドキュメント)に聞けよ!!と思われると思いますが、
#私自身の知識が無いのと、ドキュメント類・コメント・基を作った開発者がない(いない)ので一般論としてお教え下さい。
引用返信 編集キー/
■70009 / inTopicNo.2)  Re[1]: CFileFindとCFile::GetStatus()
□投稿者/ とっちゃん (195回)-(2014/02/17(Mon) 17:50:02)
とっちゃん さんの Web サイト
No70008 (nobb さん) に返信
> 私はMFCでファイルの存在判定を行うする際は「CFileFindクラス」を使用するようにしていますが、
> その昔書かれたソースではGetStatus関数で判定しているようなのです。
> 例:
>  CFileStatus status;
>  if(CFile::GetStatus(path, status)
>  {
>   //何か処理
>   //statusは未使用
>  }
>
CFileFind クラスと、CFileStatus クラスはいずれもMFCのクラスです。

CFileFind は、FindFirstFile/FindNextFile API をラップしたもので、
CFile::GetStatus() は、GetFileAttributesEx API をラップしたものです。
(CFileStatus は、WIN32_FILE_ATTRIBUTE_DATA 構造体のMFC焼き直し版のようなもの)

どちらがいいか(あるいは、直接APIを呼び出すのがいいか)と問われると
ファイルの存在チェックのために使うのであれば、無駄が多すぎるので
GetFileAttributes API か、PathFileExists APIのどちらかの利用をお勧めします。

ちなみに、私自身は、ファイルの存在チェックだけなら、
GetFileAttributes API か、PathFileExists API のどちらかを使います。
どちらを使うかは文脈に依存しますが、
基本的に、存在チェックと合わせて属性も使う場合は前者
そうではなく純粋な存在チェックだけなら後者という場合が多いです。
(ただし、状況によってはshlwapiを使いたくないという状況もあるため、あえて前者を選ぶ場合もあります)。


> これは何かメリットがあるのでしょうか?
>
メリットについては、デメリットも合わせて考慮するとどうするのがよいか?が見えてきます。
また、そのクラスやメソッドが何をするものか?も含めて複合的に判断する必要がある場合が多いです。

今回のような単純なものの場合、より簡素な判定方法がないか?という部分も考慮するほうがいいので
結果としては、第三の選択肢が最もメリットがあるということになりますけどw

引用返信 編集キー/
■70011 / inTopicNo.3)  Re[2]: CFileFindとCFile::GetStatus()
□投稿者/ nobb (2回)-(2014/02/17(Mon) 18:37:07)
No70009 (とっちゃん さん) に返信
ご回答ありがとうございます。
単純にファイルの存在判定のみと考えていますのでPathFileExists APIをしようする事にします。


あと2点お教え頂けたら幸いです。
1.
> ファイルの存在チェックのために使うのであれば、無駄が多すぎるので
との事ですが、単純にtrue/falseを得るだけの目的なのに、それ以外の機能(関数)が多いという意味で解釈してもよろしいでしょうか?

2.
> (ただし、状況によってはshlwapiを使いたくないという状況もあるため
shlwapiを使いたくない状況とはどのような時なのでしょうか?
こちらは後々の為に参考になれば・・・と思うので、書くのが面倒とか、ここで書きはじめると長くなりすぎる!とかでしたら割愛していただいても構いませんw
引用返信 編集キー/
■70012 / inTopicNo.4)  Re[3]: CFileFindとCFile::GetStatus()
□投稿者/ とっちゃん (196回)-(2014/02/17(Mon) 18:43:08)
とっちゃん さんの Web サイト
No70011 (nobb さん) に返信
> 1.
>>ファイルの存在チェックのために使うのであれば、無駄が多すぎるので
> との事ですが、単純にtrue/falseを得るだけの目的なのに、それ以外の機能(関数)が多いという意味で解釈してもよろしいでしょうか?
>
はい。
CFile::GetStatus() なら、GetFileAttributesExを行ってから、さらに CFileStatus を埋める作業がありますし
CFileFind は、FindFirstFile をしますし、クリーンナップ処理も入ります。

単純に存在チェックがしたいだけなら、余計な作業が多々あるということになります。


> 2.
>>(ただし、状況によってはshlwapiを使いたくないという状況もあるため
> shlwapiを使いたくない状況とはどのような時なのでしょうか?
> こちらは後々の為に参考になれば・・・と思うので、書くのが面倒とか、ここで書きはじめると長くなりすぎる!とかでしたら割愛していただいても構いませんw

shlwapi(SHell Light-Weight API)を使うと、その分余計な関数呼び出しが入ります。
ファイルチェックだけなら、
!(GetFileAttributes(path) & FILE_ATTRIBUTE_DIRECTORY)
で判断できるので(ただしわかりにくいw)、利用状況等々によってはそういう判断を優先する場合もあるというだけです。

昔は利用できない環境がある場合に対応(Ver.4.0なWindowsOSの場合など)する必要もあったのですが、さすがに今はそれは条件には含めなくて済みますからねw

引用返信 編集キー/
■70020 / inTopicNo.5)  Re[4]: CFileFindとCFile::GetStatus()
□投稿者/ nobb (3回)-(2014/02/18(Tue) 11:11:48)
No70012 (とっちゃん さん) に返信
再度ご回答ありがとうございます。
shlwapiなるものを教えて頂いて助かりました。
解決済み
引用返信 編集キー/
■70035 / inTopicNo.6)  Re[5]: CFileFindとCFile::GetStatus()
□投稿者/ nobb (4回)-(2014/02/19(Wed) 17:22:18)
一旦は解決したものの、shlwapiについて分からない事が出て来たので再開させて頂きます。

色々なブログ等で情報をあさっていたら「IEがないと使えない」と書かれているブログに行きつきました。
(参考:ttp://jehupc.exblog.jp/13175152/ h抜いてます)

この記事を見つけた後、MSDN(?)で確認したところXPおよびVISTA以降はIEが無くても大丈夫と書かれている(と思われる)記事を見つけました。
(参考:http://msdn.microsoft.com/en-us/library/windows/desktop/bb776779(v=vs.85).aspx )

最初のブログ記事が間違っているか、情報が古い為、当時は必要だったと判断しましたが、間違ってないでしょうか?
引用返信 編集キー/
■70036 / inTopicNo.7)  Re[6]: CFileFindとCFile::GetStatus()
□投稿者/ とっちゃん (198回)-(2014/02/19(Wed) 17:55:24)
とっちゃん さんの Web サイト
No70035 (nobb さん) に返信
> 一旦は解決したものの、shlwapiについて分からない事が出て来たので再開させて頂きます。
>
> 色々なブログ等で情報をあさっていたら「IEがないと使えない」と書かれているブログに行きつきました。
> (参考:ttp://jehupc.exblog.jp/13175152/ h抜いてます)
>
> この記事を見つけた後、MSDN(?)で確認したところXPおよびVISTA以降はIEが無くても大丈夫と書かれている(と思われる)記事を見つけました。
> (参考:http://msdn.microsoft.com/en-us/library/windows/desktop/bb776779(v=vs.85).aspx )
>
> 最初のブログ記事が間違っているか、情報が古い為、当時は必要だったと判断しましたが、間違ってないでしょうか?

Shell系のAPIは、XP以前と、XPからで大きく変わります。
XP以前はIEがShell32.dllやshlwapi.dllを更新することがあったため、IEのバージョンによって、APIの有無などが違っていました。
ですが、XPからは、Shell32.dll も shlwapi.dll もOS固有のものとして扱われるようになったため、
IEのバージョンがいくつでも、変わらなくなりました。

なので、IEがないと。。。という部分については、少なくともXPかそれ以上のOSを対象とする限りにおいては考慮する必要はありません。

この辺りが、昔は...と書いていた部分に当たります。

引用返信 編集キー/
■70037 / inTopicNo.8)  Re[7]: CFileFindとCFile::GetStatus()
□投稿者/ nobb (5回)-(2014/02/19(Wed) 19:18:34)
No70036 (とっちゃん さん) に返信
ご回答ありがとうございます。

> Shell系のAPIは、XP以前と、XPからで大きく変わります。
> XP以前はIEがShell32.dllやshlwapi.dllを更新することがあったため、IEのバージョンによって、APIの有無などが違っていました。
> ですが、XPからは、Shell32.dll も shlwapi.dll もOS固有のものとして扱われるようになったため、
> IEのバージョンがいくつでも、変わらなくなりました。
>
> なので、IEがないと。。。という部分については、少なくともXPかそれ以上のOSを対象とする限りにおいては考慮する必要はありません。
>
> この辺りが、昔は...と書いていた部分に当たります。

という事は2000まで対象のプログラムの場合は慎重に考えないといけないのですね。
今回はXP以上ですので、ひとまず安心して使用していきたいと思います。

何度もありがとうございました。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -