我需要用定义的源目录中的文件的文件描述符填充缓冲区空间。所以我有启动代码:
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对象来返回一个文件描述符,然后将其放入数组中吗?
答案 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()
打开文件或目录以获取文件描述符。
如果您只想将文件的名称存储在数组中,则可以使用malloc
或calloc
创建二维数组,并将d_name
成员复制到下一个数组中的可用插槽。或者,您可以使用所拥有的内容并使用strdup
之类的函数将字符串复制到数组中,但要小心,因为稍后需要使用free()
将其释放。
如果您确实需要文件描述符,则需要创建一个int
而不是char *
的数组。