【お題】絵本のタイトル

メモ帳で空のファイル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はやたら引数が多いしわけのわからない定数をいっぱい使いますね
泣きたくなります
開発者に問題があるのでしょうね

A 回答 (8件)

>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;
}

この回答への補足

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を使って全サブディレクトリをリストアップすると
""+*で検索するでドライブ全部のディレクトリをリストアップしてしまうのです
数十分かかってすべてのファイルを検索してしまいます
ファイルをファイル、ディレクトリをディレクトリとみなしてくれないとまともなプログラムを作れません
マイクロソフトには困ったものですね

補足日時:2003/03/03 12:59
    • good
    • 0

#2 です。


WinXP, Win2000 と VC6, VC7, BC551 の組み合わせでは問題ないみたいです。
GetFileAttributes() が失敗したかどうかが問題ですね。

マイクロソフトで苦労するといえば、日本語ドキュメントが少ない事でしょう。おかげさまで?英語ドキュメントもずいぶん読めるようになりました。

GDI+ だけでなく、Win32API は C++ で完全に書き直して欲しいと思ったりもしますね。
    • good
    • 0
この回答へのお礼

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

お礼日時:2003/03/04 03:36

GetAttribute関数自体が駄作だったのでしょう。


オブジェクトがファイルかフォルダかを判別する処理には、普通は
そんな馬鹿らしい処理はしませんよ。
    • good
    • 0

 


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関数で確認)
 
    • good
    • 0

C言語はほとんど何もわからない("Hello World!"止り)ので、有効なコメントは何もできないのですが・・・。



(1) どのコンパイラを使い、
(2) どのOS上でテスト(デバッグ)している

のかが明示されていなければ、問題の原因が環境(処理系)に固有の不具合なのか、切り分けできないのではないでしょうか?

> GetAttributeでディレクトリかどうかを検査すると

この部分のソースも開示されていませんし・・・。

# どこのベンダも瑕疵のない完璧な製品を出しているはずはないので、特定の
# 環境に固有のバグというのはあってもおかしくないとは思います。
# (API関数の仕様がOS毎に違う、バージョン互換がない、等は日常茶飯・・・。(-_-;)
    • good
    • 0

#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.
と反応しました。ちゃんと動いてます。なぜなんでしょね

# それにしてもこの 質問タイトル はどーかと思う。
    • good
    • 0

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

    • good
    • 0

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



参考URL:http://www.microsoft.com/japan/developer/library …
    • good
    • 0
この回答へのお礼

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

お礼日時:2003/03/03 12:58

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!