メモ帳で空のファイル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はやたら引数が多いしわけのわからない定数をいっぱい使いますね
泣きたくなります
開発者に問題があるのでしょうね
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;
}
この回答への補足
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を使って全サブディレクトリをリストアップすると
""+*で検索するでドライブ全部のディレクトリをリストアップしてしまうのです
数十分かかってすべてのファイルを検索してしまいます
ファイルをファイル、ディレクトリをディレクトリとみなしてくれないとまともなプログラムを作れません
マイクロソフトには困ったものですね
No.8
- 回答日時:
#2 です。
WinXP, Win2000 と VC6, VC7, BC551 の組み合わせでは問題ないみたいです。
GetFileAttributes() が失敗したかどうかが問題ですね。
マイクロソフトで苦労するといえば、日本語ドキュメントが少ない事でしょう。おかげさまで?英語ドキュメントもずいぶん読めるようになりました。
GDI+ だけでなく、Win32API は C++ で完全に書き直して欲しいと思ったりもしますね。
疑問点は残るものの問題が解決してからもわざわざ回答していただいた皆様にお礼もうしあげます
過激なタイトルは問題だったと反省しています
もっと精進したいと思います
ありがとうございました
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関数で確認)
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.
と反応しました。ちゃんと動いてます。なぜなんでしょね
# それにしてもこの 質問タイトル はどーかと思う。
No.1
- 回答日時:
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【お題】絵本のタイトル
- ・【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
どんなプログラムを書いても指...
-
フルパスから最後のディレクト...
-
「UNCパスはサポートされません...
-
FTPでputすると空ファイルが出...
-
絶対パスの絶対て英語で何でし...
-
ExcelVBAでカレントディレクト...
-
windows.hがincludeされない
-
C言語を用いたファイルの一括削...
-
セルに入力されたパスでフォル...
-
ファイルやディレクトリの存在...
-
ファイルのパスを動的に取得
-
VB2008からDLLを呼出し使いたい。
-
Delphiでエラーが出ます
-
ネットワーク上のコンピュータ...
-
いやーマイクロソフトには苦労...
-
fopenで別ディレクトリにファイ...
-
GetPrivateProfileStringでini...
-
VBAでサブフォルダ内の写真サイ...
-
webアプリケーションでの画像フ...
-
C言語でファイルを読み込みたい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
フルパスから最後のディレクト...
-
FTPでputすると空ファイルが出...
-
どんなプログラムを書いても指...
-
ExcelVBAでカレントディレクト...
-
絶対パスの絶対て英語で何でし...
-
windows.hがincludeされない
-
「UNCパスはサポートされません...
-
ファイルやディレクトリの存在...
-
ネットワーク上のコンピュータ...
-
マイクラでPythonのプログラミ...
-
C言語を用いたファイルの一括削...
-
GetPrivateProfileStringでini...
-
ExcelVBA サーバーの(共有フォ...
-
fopenで別ディレクトリにファイ...
-
セルに入力されたパスでフォル...
-
エクセルVBAで相対パスでファイ...
-
AfxLoadLibrary関数で、DLLのハ...
-
新規作成ファイルパスが有効か...
-
FTPでリモートのファイル一覧取得
-
webアプリケーションでの画像フ...
おすすめ情報