免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5895 | 回复: 18
打印 上一主题 下一主题

help!!!!linux下如何编程显示目录下的文件,包括大小,时间 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-07 16:57 |只看该作者 |倒序浏览
就像是WIN下,文件夹中视图-->详细信息 中看到的,文件名  大小 类型修改时间这样的列表。我在linux下怎么得到啊,关系到小弟的饭碗,拜托各位了。
下面是我自己写的一段程序,很不完整,也不好用
{
DIR   *dir;
char   fullpath[256],currfile[256];
struct   dirent   *s_dir;
struct   stat   file_stat;
strcpy(fullpath,Path);
dir=opendir(fullpath);
while((s_dir=readdir(dir))!=NULL){
  if((strcmp(s_dir->d_name,".")==0)||(strcmp(s_dir->d_name,"..")==0))continue;
  sprintf(currfile,"%s",s_dir->d_name);
  lstat(currfile,&file_stat);
  printf("%s\n",currfile);
      }
      closedir(dir);
}
拜托各位大虾出手相助,谢谢。

论坛徽章:
0
2 [报告]
发表于 2008-08-07 16:59 |只看该作者
那目前問題是哪在哪邊?



--

论坛徽章:
0
3 [报告]
发表于 2008-08-07 17:20 |只看该作者

回复 #2 kenduest 的帖子

这一段只能显示文件名字,并且顺序也没有规律,也即不知道它列出的文件名是按照什么顺序排的。大小的话,我用file_stat.st_size,出来的大小都一样的,不知道为什么。还有我的目的是要做一个和shell中的ls -l或者ll命令一样的程序。搞不来啊,郁闷。本来就是菜鸟,现在还靠linux编程混饭吃,哎

论坛徽章:
0
4 [报告]
发表于 2008-08-07 17:26 |只看该作者

回复 #1 chinahelloworld 的帖子

还有,我用if(S_ISDIR(file_stat.st_mode))。。。。。
编译能过,但是S_ISDIR(file_stat.st_mode)的值总是假,不知道为什么,本来按道理,如果是是目录的话,应该为真啊

论坛徽章:
0
5 [报告]
发表于 2008-08-07 17:29 |只看该作者
s_dir->d_name只是文件名,你需要将它与fullpath拼接成全路径名,再调用stat

[ 本帖最后由 web_surf 于 2008-8-7 17:37 编辑 ]

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
6 [报告]
发表于 2008-08-07 21:03 |只看该作者
原帖由 chinahelloworld 于 2008-8-7 16:57 发表
就像是WIN下,文件夹中视图-->详细信息 中看到的,文件名  大小 类型修改时间这样的列表。我在linux下怎么得到啊,关系到小弟的饭碗,拜托各位了。
下面是我自己写的一段程序,很不完整,也不好用
{
DIR   ...

知道 ls 不?看看它的代码。

论坛徽章:
0
7 [报告]
发表于 2008-08-07 21:33 |只看该作者
楼主说的就是ls -l 的功能。

正如楼主在程序中做的,取得的stat结构里的成员就包含了楼主所要的所有信息,建议你好好看看这个结构的定义

论坛徽章:
34
亥猪
日期:2015-03-20 13:55:11戌狗
日期:2015-03-20 13:57:01酉鸡
日期:2015-03-20 14:03:56未羊
日期:2015-03-20 14:18:30子鼠
日期:2015-03-20 14:20:14丑牛
日期:2015-03-20 14:20:31辰龙
日期:2015-03-20 14:35:34巳蛇
日期:2015-03-20 14:35:56操作系统版块每日发帖之星
日期:2015-11-06 06:20:00操作系统版块每日发帖之星
日期:2015-11-08 06:20:00操作系统版块每日发帖之星
日期:2015-11-19 06:20:00黄金圣斗士
日期:2015-11-24 10:43:13
8 [报告]
发表于 2008-08-07 21:50 |只看该作者
ls -alR   是这个么?

论坛徽章:
0
9 [报告]
发表于 2008-08-07 23:33 |只看该作者
原帖由 chinahelloworld 於 2008-8-7 17:20 發表
這一段只能顯示文件名字,並且順序也沒有規律,也即不知道它列出的文件名是按照什麼順序排的。


是沒有排序過的成果呈現,與 ls -f 輸出會是一樣的。ls 預設會依據檔名排序。

大小的話,我用file_stat.st_size,出來的大小都一樣的


不至於吧。但是你給的 code 沒寫這部份啊....

還有我的目的是要做一個和 shell中的ls -l或者ll命令一樣的程序。搞不來啊,鬱悶。本來就是菜鳥,現在還靠linux編程混飯吃,哎


那你得把結果進陣列,然後用 sort() 函數排序後才能夠達成該需求。

我用if(S_ISDIR(file_stat.st_mode))。。。。。
編譯能過,但是S_ISDIR(file_stat.st_mode)的值總是假,不知道為什麼,本來按道理,如果是是目錄的話,應該為真啊


你這樣說沒有程式碼無法判斷問題點。


  1. #include <sys/types.h>
  2. #include <sys/stat.h>
  3. #include <unistd.h>
  4. #include <stdio.h>

  5. int main()
  6. {
  7.   struct stat buf;

  8.   stat("/etc",&buf);

  9.   if (S_ISDIR(buf.st_mode) == 0)
  10.     printf("\n\t/etc is not directory !\n\n");
  11.   else
  12.     printf("\n\t/etc is directory !\n\n");

  13.   return 0;
  14. }
复制代码


建議你先 man 2 stat 把結構體看清楚後才好 coding。

--

论坛徽章:
0
10 [报告]
发表于 2008-08-08 07:58 |只看该作者
想省事的话,就
  1. system("ls -alt dir_name  > result")
复制代码

然后解析result文件
想玩高深的话就看coreutils中ls的源代码咯

[ 本帖最后由 duanjigang 于 2008-8-8 08:00 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP