私は起動時にディレクトリ内のすべてのファイルのリストを取得し、それらを使って何らかの処理を行います(ネットワーク経由での転送用にパケット化します)。現在のバージョンは静的で、プログラムはプログラムの開始時にファイルのみを表示します。今度は、動的なバージョンに変更して、ディレクトリに追加された新しいファイルを継続的に見ることができます(たとえば、f1、f2、f3などの意味のある名前が増えたと仮定しましょう)。 。私はいくつかのインデックスを使用することができますこのように)。C++は新しいファイルをディレクトリに追加しました
今、これはコードの一部(すべてのファイルの静的読み取り)である:
DIR *dp;
struct dirent *dirp;
char * dir = new char[inData->dir.length() + 1];
strcpy(dir, inData->dir.c_str());
dp = opendir(dir);
int file_index = 0;
int total_files = DataUtil::count_files(dp);
if (readdir(dp) == NULL)
rewinddir(dp);
//for each file in the directory
while ((dirp = readdir(dp))) {
string f_name = dirp->d_name;
if (f_name != "." && f_name != "..") { // except . and ..
//Do some processing
my_function(f_name, file_index);
file_index++;
}
}
closedir(dp);
私は新しいファイルに気づきrewinddir(dp);
機能とfile_index
を使用してコードを変更しました。しかし、それは動作しません。問題はどこだ?
DIR *dp;
struct dirent *dirp;
char * dir = new char[inData->dir.length() + 1];
strcpy(dir, inData->dir.c_str());
dp = opendir(dir);
int file_index = 0;
int total_files = MyDataUtil::count_files(dp);
if (readdir(dp) == NULL)
rewinddir(dp);
//for each file in the directory
while ((dirp = readdir(dp))) {
string f_name = dirp->d_name;
if (f_name != "." && f_name != "..") {
//skip files already read
for (int var = 0; var < file_index; var++) {
readdir(dp);
}
//Do some processing
my_function(f_name, file_index);
file_index++;
//reset dir stream, and update total_files
rewinddir(dp);
total_files = MyDataUtil::count_files(dp);
}
}
closedir(dp);
total_files機能:ここで
int MyDataUtil::count_files(DIR *dp){
struct dirent *dirp;
int num = 0;
while ((dirp = readdir(dp))) {
string f_name = dirp->d_name;
if (f_name != "." && f_name != "..")
num++;
}
return num;
}
はrewinddir
ドキュメントです。それは「返されるかもしれないし、返されないかもしれない!ここで
Description:
The rewinddir function is used to reinitialize the directory stream dirstream, so that if you call readdir
it returns information about the first entry in the directory again. This function also notices if files
have been added or removed to the directory since it was opened with opendir. (Entries for these files
might or might not be returned by readdir if they were added or removed since you last called opendir
or rewinddir.)
することができますこのコードの問題は、まずあなたのPCを常にビジー状態に保つための無限ループを作成しようとしています。その後、新しいファイルがリストの最後に終わることは当然のことですが、そうではありません確かに。しかし、これらの2つの問題のほかに、あなたのコードについて話をすると、total_filesに値を割り当てており、あなたはそれを使って何かをしています。 – Marco
@Marco私の更新を見てください。 count_filesがdirポインタを変更するように見えます。 total_filesは別のファイルで使用されます。 –
'myFileCount'関数のように見えますが、ファイルポインタをインクリメントしています。だから、 'total_files = MyDataUtil :: count_files(dp);'の後に別の 'rewinddir(dp)'を追加する必要があります。少なくとも今は動作します。 –