• ベストアンサー

いやーマイクロソフトには苦労します

メモ帳で空のファイルx.txtを作り これをGetAttributeでディレクトリかどうかを検査すると x.txtはディレクトリとみなされてしまいます 今x.txtがディレクトリだと動作が異常になる プログラムを作っていたので困っています そこでx.txtを排除するためにサイズを検査して0ならば 処理をしないようにしようと思ったのですが サイズを調べるのに void DispFileSize() { HANDLE hFile; DWORD FileSizeLow, FileSizeHigh; hFile = CreateFile( "\\command.com", 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); FileSizeLow = GetFileSize(hFile, &FileSizeHigh); printf("ファイルサイズ: %ud*2^32 + %ud\n", FileSizeHigh, FileSizeLow); CloseHandle(hFile); } などいいう馬鹿らしい処理をしなければなりません しかもこれはディレクトリに適用するものではないのでうまくいくかどうか・・・ ファイルサイズを出すのに簡単にする方法はないのでしょうか? しかしAPIはやたら引数が多いしわけのわからない定数をいっぱい使いますね 泣きたくなります 開発者に問題があるのでしょうね

質問者が選んだベストアンサー

  • ベストアンサー
noname#30727
noname#30727
回答No.2

>x.txtはディレクトリとみなされてしまいます どのようにしたらファイルがディレクトリとみなされる事があるのでしょうか? #include <windows.h> #include <iostream> using namespace std; int main() { DWORD attrs = GetFileAttributes("x.txt"); if (attrs == (DWORD)-1) { cout << "error" << endl; } else { cout << ((attrs & FILE_ATTRIBUTE_DIRECTORY) ? "dir" : "file") << endl; } return 0; }

nubou
質問者

補足

attributes=GetFileAttributes(x.txt); if((attributes&FILE_ATTRIBUTE_DIRECTORY)==FILE_ATTRIBUTE_DIRECTORY)  cout<<"x.txt is directory"<<endl; else cout<<"x.txt is file"<<endl; においてメモ帳を開いて何も入力しないでx.txtに格納し 上記プログラムを実行するとx.txtはディレクトリとみなされるのです しかもディレクトリは""(空)なので これでFindFirst、FindNextを使って全サブディレクトリをリストアップすると ""+*で検索するでドライブ全部のディレクトリをリストアップしてしまうのです 数十分かかってすべてのファイルを検索してしまいます ファイルをファイル、ディレクトリをディレクトリとみなしてくれないとまともなプログラムを作れません マイクロソフトには困ったものですね

その他の回答 (7)

noname#30727
noname#30727
回答No.8

#2 です。 WinXP, Win2000 と VC6, VC7, BC551 の組み合わせでは問題ないみたいです。 GetFileAttributes() が失敗したかどうかが問題ですね。 マイクロソフトで苦労するといえば、日本語ドキュメントが少ない事でしょう。おかげさまで?英語ドキュメントもずいぶん読めるようになりました。 GDI+ だけでなく、Win32API は C++ で完全に書き直して欲しいと思ったりもしますね。

nubou
質問者

お礼

疑問点は残るものの問題が解決してからもわざわざ回答していただいた皆様にお礼もうしあげます 過激なタイトルは問題だったと反省しています もっと精進したいと思います ありがとうございました

  • vakua
  • ベストアンサー率10% (1/10)
回答No.7

GetAttribute関数自体が駄作だったのでしょう。 オブジェクトがファイルかフォルダかを判別する処理には、普通は そんな馬鹿らしい処理はしませんよ。

noname#4564
noname#4564
回答No.6

  No.5 のコメントだけではちょっと無責任なので、ちょっとだけフォロー。 処理系(環境)に固有の問題なのか、プログラムのコーディングに問題があるのか、 原因を切り分けるためのヒントです。 (1) 問題のテキストファイルのファイル属性をエクスプローラ等、他のプログラム   で確認する。   (この時点で結果が×なら、メモ帳かOSの問題です。考えにくいですが・・・) (2) 上記(1)で問題なければ、コンパイラの問題、または、プログラムの問題と考え   られますので、 (3) 問題のプログラムを他の処理系(BCC、GCCなど)で検証する。 (4) 上記(3)で問題なければ、現在お使いのコンパイラ(VC++6.0?または、VC++.NET   ??)に原因がありそうです。(3)でも意図した実行結果とならなければ、プログ   ラムのコーディングに問題があると思います。 (5) 上記(1)~(4)の結果、プログラムに罪がなく、OSに問題があると推定されるなら、   別のOSでも動作検証してみる。 まあ、大体こんな感じです。解決になるかどうかはともかく、最低限、問題の「切り分け」 はできるでしょう。 ちなみに、当方Windows XP SP1 (+アップデートパッチ複数)ですが、メモ帳でサイズ ゼロのテキストファイルを作成しても、フォルダ属性にはなりません。 (Office 2000 VBA の GetAttr関数で確認)  

noname#4564
noname#4564
回答No.5

C言語はほとんど何もわからない("Hello World!"止り)ので、有効なコメントは何もできないのですが・・・。 (1) どのコンパイラを使い、 (2) どのOS上でテスト(デバッグ)している のかが明示されていなければ、問題の原因が環境(処理系)に固有の不具合なのか、切り分けできないのではないでしょうか? > GetAttributeでディレクトリかどうかを検査すると この部分のソースも開示されていませんし・・・。 # どこのベンダも瑕疵のない完璧な製品を出しているはずはないので、特定の # 環境に固有のバグというのはあってもおかしくないとは思います。 # (API関数の仕様がOS毎に違う、バージョン互換がない、等は日常茶飯・・・。(-_-;)

回答No.4

#include <windows.h> #include <iostream> int main() { DWORD attr = GetFileAttributes("x.txt"); std::cout << std::hex << attr << ' '; if ( attr & FILE_ATTRIBUTE_DIRECTORY ) { std::cout << "DIR\n"; } else { std::cout << "NOT A DIR.\n"; } return 0; } 長さ 0 のファイル x.txt に対して上記のコードは: 20 NOT A DIR. と反応しました。ちゃんと動いてます。なぜなんでしょね # それにしてもこの 質問タイトル はどーかと思う。

noname#4252
noname#4252
回答No.3

エラーの 0xFFFFFFFF が返っているのでは?

  • timber
  • ベストアンサー率29% (218/739)
回答No.1

_fstatでサイズが取れると思いますが。

参考URL:
http://www.microsoft.com/japan/developer/library/vccore/_crt__fstat.2c_._fstati64.htm
nubou
質問者

お礼

ありがとうございます 別の手段で解決しました

関連するQ&A