C填充缓冲区

时间:2012-10-30 04:35:33

标签: c posix file-descriptor

我需要用定义的源目录中的文件的文件描述符填充缓冲区空间。所以我有启动代码:

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);
}

如何完成此循环以将给定目录的所有文件描述符放入名为“buffer”的数组中?我应该使用像DirEntry->d_name这样的DirEntry对象来返回一个文件描述符,然后将其放入数组中吗?

3 个答案:

答案 0 :(得分: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来保存条目,但可能不值得担心。如果文件名的内存分配失败,那么其他方法就不会有效。

答案 1 :(得分:0)

文件描述符是由open()系统调用返回的“int”类型值。它不在DirEntry结构中。因此,首先,您应该将缓冲区数组定义为int类型,然后您可以使用open()系统调用打开循环中的每个文件,并在缓冲区数组中保存open()返回的文件描述符。

答案 2 :(得分:0)

你的问题没有多大意义。如果需要文件描述符,则必须使用open() 打开文件或目录以获取文件描述符。

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

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