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()or 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()来获取文件描述符。

如果您只想将文件的名称存储在一个数组中,那么您可以使用mallocor创建一个二维数组,并将成员calloc复制d_name到数组中的下一个可用插槽。或者,您可以使用您所拥有的并使用一个函数,例如strdup将字符串复制到您的数组,但要小心,因为您稍后需要使用free().

如果您确实需要文件描述符,则需要创建一个数组,int而不是char *.

于 2012-10-30T05:01:06.437 回答