0

定義されたソースディレクトリからのファイルのファイル記述子でバッファスペースを埋める必要があります。だから私はスタートアップコードを持っています:

int main(int argc, char* argv[])
{
    DIR *src=opendir(argv[1]);

    struct dirent *DirEntry;
    char* buffer[200];
    do {
        DirEntry = readdir(src);
        if(DirEntry != NULL) {
            //put file into buffer
        }
    }while(DirEntry!=NULL);
}

このループを完了して、特定のディレクトリのすべてのファイル記述子を「バッファ」と呼ばれる配列に配置するにはどうすればよいですか?DirEntryのオブジェクトを使用してDirEntry->d_name、ファイル記述子を返し、それを配列に入れる必要がありますか?

4

3 に答える 3

1

ソースディレクトリから宛先ディレクトリにファイルを移動する必要がある場合は、ファイル記述子よりもはるかに多くのファイル名が必要になります。名前を使用すると、必要なときにいつでも記述子を開いたり閉じたりできます。名前がないと、ターゲットディレクトリにファイルを適切に作成できません。ただし、ファイル記述子も処理できます。

したがって、持っていると仮定するとstrdup()、次を使用できます。

typedef struct File
{
    char *name;
    int   fd;
} File;

そしてあなたのループで:

if (DirEntry != NULL)
{
    buffer[i].name = strdup(DirEntry->d_name);
    if (buffer[i].name != 0)
        buffer[i].fd = open(buffer[i].name, O_RDONLY);
    i++;
}

ここで、bufferはの配列でFileあり、iは便利な整数です。

enum { MAX_FILES = 4096 };
int i;
File buffer[MAX_FILES];

また、メイン条件に条件を追加して、オーバーフローが発生しないようにする必要があります(または、固定サイズのバッファーを動的に割り当てられたバッファーに置き換えます)。

if (DirEntry != NULL && i < MAX_FILES)

i限界に達した場合、賢明にループを壊すことができます。名前がファイルを表すかどうかをテストできます(FIFO、ブロックデバイス、文字デバイス、ソケット、シンボリックリンク、ディレクトリなどではありません)。あなたはおそらくそれを使うでしょstat()lstat()open()呼び出しが失敗した場合、ファイル記述子は負(-1)になります。メモリ割り当てが失敗した場合にインクリメントしないことでエントリを節約できますiが、おそらく心配する価値はありません。ファイル名のメモリ割り当てが失敗した場合、他に機能するものはほとんどありません。

于 2012-10-30T05:35:31.970 に答える
0

ファイル記述子は、open()システムコールによって返される「int」型の値です。DirEntry構造ではありません。したがって、最初にバッファ配列をint型として定義する必要があります。次に、open()システムコールを使用してループ内の各ファイルを開き、open()で返されたファイル記述子をバッファ配列に保存できます。

于 2012-10-30T05:00:24.147 に答える
0

あなたの質問はまったく意味がありません。ファイル記述子が必要な場合は、ファイルまたはディレクトリを開いopen()てファイル記述子を取得する必要があります。

ファイルの名前を配列に格納するだけの場合は、mallocまたはを使用して2次元配列を作成し、そのメンバーを配列内の次に使用可能なスロットにcallocコピーできます。d_nameまたは、持っているものを使用して、文字列を配列にコピーするなどの関数を使用することもできますがstrdup、後でを使用して文字列を解放する必要があるため、注意してくださいfree()

実際にファイル記述子が必要な場合は、intではなくの配列を作成する必要がありますchar *

于 2012-10-30T05:01:06.437 に答える