gpt4 book ai didi

c - Go 代码使用 getdents() 列出 Linux 目录中的文件

转载 作者:IT王子 更新时间:2023-10-29 02:05:58 50 4
gpt4 key购买 nike

作为练习,我想将一些使用许多系统调用的 C 代码翻译成 Golang。我找到了这个 nice code example在 Unix 和 Linux StackExchange 上:

/*
* List directories using getdents() because ls, find and Python libraries
* use readdir() which is slower (but uses getdents() underneath.
*
* Compile with
* ]$ gcc getdents.c -o getdents
*/
#define _GNU_SOURCE
#include <dirent.h> /* Defines DT_* constants */
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/syscall.h>

#define handle_error(msg) \
do { perror(msg); exit(EXIT_FAILURE); } while (0)

struct linux_dirent {
long d_ino;
off_t d_off;
unsigned short d_reclen;
char d_name[];
};

#define BUF_SIZE 1024*1024*5

int
main(int argc, char *argv[])
{
int fd, nread;
char buf[BUF_SIZE];
struct linux_dirent *d;
int bpos;
char d_type;

fd = open(argc > 1 ? argv[1] : ".", O_RDONLY | O_DIRECTORY);
if (fd == -1)
handle_error("open");

for ( ; ; ) {
nread = syscall(SYS_getdents, fd, buf, BUF_SIZE);
if (nread == -1)
handle_error("getdents");

if (nread == 0)
break;

for (bpos = 0; bpos < nread;) {
d = (struct linux_dirent *) (buf + bpos);
d_type = *(buf + bpos + d->d_reclen - 1);
if( d->d_ino != 0 && d_type == DT_REG ) {
printf("%s\n", (char *)d->d_name );
}
bpos += d->d_reclen;
}
}

exit(EXIT_SUCCESS);
}

我只能使用 ioutil.ReadDir 对此进行编码,这违背了目的。有人知道如何翻译这个吗?

最佳答案

我会避免使用此代码。如所写,这是错误的:在 32 位系统甚至某些 64 位系统上,SYS_getdents 是不提供 d_type 并且不支持 64 位的遗留系统调用- 位 inode 编号,这意味着您在现代文件系统上会遇到无端错误。即使您修复了它,也不会比内联 readdir 更好,它在内部做的事情基本上完全相同。

关于c - Go 代码使用 getdents() 列出 Linux 目录中的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25022486/

50 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com