プロが教えるわが家の防犯対策術!

C++でファイル検索のプログラムを組んでいるのですが、上手く動作してくれません。
FindFirstFileとNextFileの再帰を使っているのですが、全く動作しません。

開発環境はVisualStudio2017です。

[code]
#include<Windows.h>
#include<iostream>
#include<string>
#include<fstream>

using namespace std;

string current = "C:\\Users\\";
char szDirectoryName[MAX_PATH];

int FindFile(string current);

int main() {
FindFile(current);
return 0;
}

int FindFile(string current) {
ofstream ofs("FileName.txt",ios::app);
WIN32_FIND_DATA date;
HANDLE handle = FindFirstFile(current.c_str(), &date);
if (handle == INVALID_HANDLE_VALUE)cout << "ファイルなし(FindFirstFile)\n" << endl;
else {
for (;;) {
if ((strcmp(date.cFileName, ".") != 0) && (strcmp(date.cFileName, "..") != 0)) {
if (date.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
GetCurrentDirectory(sizeof(szDirectoryName) / sizeof(szDirectoryName[0]), szDirectoryName);
cout << "(DirectryName)" << szDirectoryName << endl;
current = current + "\\" + date.cFileName;
cout << "(current)" << current << endl;
FindFile(current);
}
else {
cout << "(FileName)" << date.cFileName << endl;
ofs << date.cFileName << endl;
}
}
if (!FindNextFile(handle, &date)) {
if (GetLastError() == ERROR_NO_MORE_FILES) {
cout << "ファイルなし(FindNextFile)\n" << endl;
break;
}
break;
}
}
}
FindClose(handle);
ofs.close();
return 0;
}
[/code]

A 回答 (4件)

[code][/code]はこっちですかね~


https://dixq.net/forum/viewtopic.php?f=3&t=20450 …

あとは…teratailか知恵袋辺りにも投げる予定でしょうか?
LogonUser()APIで投げてましたし。

>あと break も実は 1個でいいよね.

>if (!FindNextFile(handle, &date)) {
> if (GetLastError() == ERROR_NO_MORE_FILES) {
>  cout << "ファイルなし(FindNextFile)\n" << endl;
>  break;
> }
> break;
>}
ここは1つでいいですよね。
まぁ、最適化されるでしょうけど。
    • good
    • 0

本題とは全く関係ないんだけど, 「date」ってなんだろ. なんの日付?



あと break も実は 1個でいいよね.

スタックサイズが気になる人は std::stack を使うとよい.
    • good
    • 0

ofsの件はよろしくやって貰うとして……



>HANDLE handle = FindFirstFile(current.c_str(), &date);

ではディレクトリ名(正確には違うが…)の指定だけなので…

string path = current + "*.*";
HANDLE handle = FindFirstFile(path.c_str(), &date);
と変更。

>current = current + "\\" + date.cFileName;
で、再帰から帰ってきた時に破壊される為、2番目以降のディレクトリ名が変になるので削除。

>cout << "(current)" << current << endl;
上記の削除を行ったので、
cout << "(current)" << current + date.cFileName << endl;
に変更。
その後の
>FindFile(current);

FindFile(current + date.cFileName + "\\");
に変更。


辺りでとりあえず動作しましたかね。
# 再帰が深いのとファイル/ディレクトリが多かったので途中で止めちゃいましたけどね。
# ディレクトリが深い場合はスタックサイズ拡大しないと死ぬかも知れませんので、そこはよろしく処理してくださいな。(再帰とはそういうモノです)
    • good
    • 0

[code][/code]には対応していませんけどね。


ここは。
# ってことでどっかとのマルチなんでしょうなぁ…

ofstream ofs("FileName.txt",ios::app);
はオープンしたまま、再帰で再度オープンしようとしますが、多重の書き込みオープンは可能なんですかね?

FindFirstFile()って、ディレクトリ名だけ渡した場合にそのディレクトリに含まれるファイル一覧取得できましたっけ?
そのディレクトリ自体の情報だけ取得して、他のエントリまでFindNextFile()で検索しないような?
    • good
    • 0

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