在C中实现ls -al命令

在C中实现ls -al命令,第1张

概述在C中实现ls -al命令

作为我的一个类的一部分,我必须用C编写一个程序来复制ls -al命令的结果。 我已经阅读了必要的材料,但是我仍然没有得到正确的结果。 这是我的代码到目前为止,它只能打印出文件大小和文件名,但文件大小打印不正确。

码:

#include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <dirent.h> int main(int argc,char* argv[]) { DIR *mydir; struct dirent *myfile; struct stat mystat; mydir = opendir(argv[1]); while((myfile = readdir(mydir)) != NulL) { stat(myfile->d_name,&mystat); printf("%d",mystat.st_size); printf(" %sn",myfile->d_name); } closedir(mydir); }

这些是执行代码后的结果:

[root@localhost ~]# ./a.out Downloads 4096 .. 4096 hw22.c 4096 ankur.txt 4096 . 4096 destination.txt

这里是正确的大小:

迫使windows更新文件访问时间的方法*现在*

删除2级子文件夹,但保留1级子文件夹

命令或脚本来重命名窗口中的多个文件

Python – 访问受保护的networking资源

使用C ++或任何windows脚本语言格式化文本数据

[root@localhost ~]# ls -al Downloads total 20 drwxr-xr-x. 2 root root 4096 Nov 26 01:35 . dr-xr-x---. 24 root root 4096 Nov 26 01:29 .. -rw-r--r--. 1 root root 27 Nov 21 06:32 ankur.txt -rw-r--r--. 1 root root 38 Nov 21 06:50 destination.txt -rw-r--r--. 1 root root 1139 Nov 25 23:38 hw22.c

任何人都可以请指出我的错误。

谢谢,

ANKUR

设置文件和目录的文件权限

更快的方式来读取文件比boost :: file_mapPing?

使用命名pipe道(或其他)作为内存中的文件

调用posix_spawn时closures所有文件句柄

访问我使用相同的应用程序创build的文件时,linux中的权限被拒绝

myfile->d_name是文件名而不是路径,所以您需要首先将文件名追加到"Downloads/file.txt"目录下,如果不是工作目录:

char buf[512]; while((myfile = readdir(mydir)) != NulL) { sprintf(buf,"%s/%s",argv[1],myfile->d_name); stat(buf,&mystat); ....

至于为什么它打印4096是链接的大小. 和..从最后一次调用stat() 。

注意:你应该分配一个足够大的缓冲区来保存目录名,文件名是NulL字节和分隔符,就像这样

strlen(argv[1]) + name_MAX + 2;

这是我为有兴趣的人工作的最终代码。 它打印正确的文件大小。 信用可以提供回答,只需把代码放在一起即可。 输入我得到这个工作是“./main”。 。

#include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <dirent.h> int main(int argc,char* argv[]) { DIR *mydir; struct dirent *myfile; struct stat mystat; char buf[512]; mydir = opendir(argv[1]); while((myfile = readdir(mydir)) != NulL) { sprintf(buf,&mystat); printf("%zu",myfile->d_name); } closedir(mydir); }

我相信你会注意到,如果你./a.out . 你会得到你期望的行为。

你有一个微妙的BUG,如果你检查你的调用stat(2)的返回码,可以观察到。

最基本的错误是: readdir(2) (代码中的myfile readdir(2)返回的dirent将有一个相对于mydir的d_name 。 你的代码将stat ..首先,成功,所以mystat将包含..有效数据,然后所有后续调用stat(2)将失败,返回-1 ,你不检查,所以mystat不会被修改,你将打印旧值的st_size ,即.. 。

麻烦的是,当你stat("ankur.txt",&mystat) ,你不工作的文件"Downloads/ankur.txt" 。 stat()最有可能失败; 或者,它正在报告不同的文件。

因此,您需要查看您的系统是否支持POSIX 2008中的fstatat() – new,或者安排将文件名称作为目录名称的前缀。

或者也许只是系统(“LS – AL”)也将工作!

总结

以上是内存溢出为你收集整理的在C中实现ls -al命令全部内容,希望文章能够帮你解决在C中实现ls -al命令所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1285176.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-09
下一篇2022-06-09

发表评论

登录后才能评论

评论列表(0条)

    保存