0

しばらく前にこのコードを受け取りました。私はついにそれをテストすることに取り掛かりました(ファイルを別の場所に置くためにいくつかの変更を加えました)...

void AddFiles(AnsiString path/*, TDataSet *DataSet*/)
{
TSearchRec sr;
int f;
    f = FindFirst(path+"\\*.*", faAnyFile, sr);
    while( !f )
    {
        if(sr.Attr & faDirectory)
        {
                if(sr.Name != "."   &&   sr.Name != "..")
                {
                        path.sprintf("%s%s%s", path, "\\", sr.Name);
                        AddFiles(path/*, DataSet*/);
                }
        }
        else
        {
                Form1->ListBox1->Items->Add(path+ "\\"+ sr.Name);
                //DataSet->Append();
                //DataSet->FieldByName("Name")->Value = sr.Name;
                /* other fields ... */
                //DataSet->Post();
        }
        f = FindNext(sr);
    }
    FindClose(sr);
}

正しく動作しません。最初は混みますが..

の実際の構造...

ルート ルート\サブディレクトリ1 ルート\サブディレクトリ2 ルート\サブディレクトリ3

このようにぐちゃぐちゃになる…

root root\subdir1 root\subdir1\subdir2 root\subdir1\subdir2\subdir3

そして最終的に、ルートまたはサブ\サブフォルダーを含めるのをやめ、「パス」にはサブフォルダーのみが含まれます(ルートフォルダーなし)

これは、使用可能なフルパス ファイル名を取得するのにはまったく役に立ちません。

コードが間違っている場所を教えてください... またはディレクトリとそのすべてのサブディレクトリでフルパスのファイル名を取得する方法についてアドバイスをください。

なるべく基本にしたい。つまり、珍しい高度な C++ 機能はありません。ビルダー初心者がデバッグできる可能性が高いもの。

4

1 に答える 1

4

ここでは、各サブパスを現在のパスに追加します。

path.sprintf("%s%s%s", path, "\\", sr.Name);
AddFiles(path/*, DataSet*/);

path結合されたパスに新しい変数を使用して、ディレクトリ内の残りのファイル/ディレクトリにまだ必要な変数を台無しにしないようにします。

AnsiString subpath;
subpath.sprintf("%s%s%s", path, "\\", sr.Name);
AddFiles(subpath/*, DataSet*/);
于 2009-01-19T04:32:05.873 に答える