LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 6318|回复: 62

求助: 一个获取文件信息的C语言程序.

[复制链接]
发表于 2009-9-11 15:17:17 | 显示全部楼层 |阅读模式
我想用一个程序管理LFS/BLFS的软件包, 但又找不到很合适的, 决定用一个最简的C语言程序来处理.

这个程序从标准输入读入文件名, 然后根据文件名获取文件类型, 文件模式, 最后修改时间, 大小, 和md5或sha256校验码.

文件类型可以为 'D', 'S', 或'F'
'D'表示目录, 'S'表示链接, 'F'表示其他文件.

使用时将包编译安装到一个临时目录, 然后在临时目录里用
find | C程序名 > 数据库文件

我写了一个程序头, 希望那位有时间能完善里面的get_file_info函数, 这个函数是包管理器的基本.

示例程序如下:



  1. #include "stdio.h"
  2. #include "string.h"

  3. #define MAX_NAME_LEN    (4096)

  4. void get_file_info(char* csFileName);

  5. int main()
  6. {
  7.         char    *pRet=NULL;
  8.         char    csName[MAX_NAME_LEN];
  9.         int     count=0;
  10.         int     len;

  11.         while(1)
  12.         {
  13.                 pRet=fgets(csName, MAX_NAME_LEN, stdin);
  14.                 if(NULL == pRet)
  15.                         break;

  16.                 //remove \n
  17.                 len=strlen(csName);
  18.                 if(csName[len-1] == '\n') csName[len-1]=0;

  19.                 //to stdout.
  20.                 get_file_info(csName);
  21.                 count++;
  22.         }

  23.         return count;
  24. }

  25. //routine for get file information, such as file tye, file Last Modify Time,
  26. //file mode, file size, file md5 checksum, and output to stdout.
  27. // file type:  'D' Directory. 'S' Symbol link. 'F' -- Normal file.
  28. // if file type is 'F', then output name, mode, LMT, size,  md5checksum.
  29. // if 'D', output name, mode, LMT
  30. // if 'S', output name, mode, LMT, link destination.
  31. void get_file_info(char* csFileName)
  32. {
  33.         unsigned int    iTestSize=3000;
  34.         char            cTestType='F';
  35.         char            *csTestSum="80a8b5938123499ad";
  36.         char            *csTestMode="0777";
  37.         char            *csLMT="2008-09-11 19:11:36";

  38.         //type 'F' , name, mode, LMT, size, cksum
  39.         printf("%C,%s,%s,%s,%d,%s\n", 'F', csFileName,
  40.                 csTestMode, csLMT, iTestSize, csTestSum);
  41. }

复制代码



怎么贴能保持缩进?!
发表于 2009-9-11 16:20:24 | 显示全部楼层
听起来,你这个程序要做的事情就是 checkinstall 做的事情,何不直接拿 checkinstall 来用或者改一改?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-9-11 17:34:38 | 显示全部楼层
貌似checkinstall太复杂, 还要抓安装的文件.

我们需要最简单的, 只有一两个函数就能搞定的, 最高效的工具. 易读, 也不易出问题.

然后用bash将这些工具粘合起来.
回复 支持 反对

使用道具 举报

发表于 2009-9-11 19:34:41 | 显示全部楼层
LFS/BLFS这种自编自用的东西搞这么复杂干什么,我用tar管那些包不一样管得好好的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-9-11 19:47:31 | 显示全部楼层
我认为这已经很简单了.. 只有两三个函数, 看几分钟就能知道代码干吗

还提供文件校验服务, 万一什么东东修改了你的文件, 还有机会知道.

另外也能提供信息给象gpaco那样的工具
回复 支持 反对

使用道具 举报

发表于 2009-9-11 20:00:53 | 显示全部楼层
这个估计要用到UNIX编程了,可惜近来已经无兴趣,堕落了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-9-11 20:27:42 | 显示全部楼层
坛子里有时间的兄弟多帮帮忙. 玩完LFS后, 有个合适的小程序管理已安装的包非常重要. 理论上大家都能受益. 代码的作者具有署名权, 呵呵.

东西越简单, 应用的范围就越广,就越能组合出复杂且稳定的东西.

这个小程序使用起来很简单, 软件包--prefix=/usr后, make install时一般都可以指定安装路径. 不要直接安装到/, 而是到/tmp下一个路径里, 进行必要的strip操作, 压缩一些文档如man和info,
然后用这个程序记录软件包的组成, 最关键的是校验吗.

这个程序OK后, 我们再讨论怎么校验文件, 怎么删除文件,

这个也完成了, 再配以自动化的编译脚本, 可以方便大家.

编译脚本完全用bash写, 比Gentoo的简单很多, 比slackware的强很多, 定义好良好的接口, 让熟悉LFS和Bash的随意操作, 搞定后通过git共享给大家...  这才是理想中的ALFS.

说实在的, 我非常不喜欢以后采用XML的ALFS.
用着不爽, 起而改之
这就是Linux的精神. 也是Linux永葆青春的动力之一.

据说, RedHat有个牛人因为不满X太罗嗦, 另起炉灶了..
回复 支持 反对

使用道具 举报

发表于 2009-9-11 20:34:54 | 显示全部楼层
  1. echo "FILES=(" >> profile.pkg
  2. for f in $(find . -type f ! -name profile.pkg) ; do echo "${f#.}" >> profile.pkg ; done
  3. echo -e ")\nDIRS=(" >> profile.pkg
  4.         for d in $(find . -type d) ; do echo "${d#.}" >> profile.pkg ; done
  5. echo ")" >> profile.pkg
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-9-11 21:13:47 | 显示全部楼层
感谢tusooa.
find在找到文件后, 确实可以执行一些命令, 如打印文件信息啥的. 然后调用md5sum也可以.
我研究一下, 实在不行就find+md5sum吧...

删除就用gawk+rm...

先删链接, 再删文件, 然后是目录.

对校验来说... 效率高些还是很重要.

继续征集C语言代码一周... 下周我完成build脚本改造后, 如果还征不到代码, 就自己动手了...
回复 支持 反对

使用道具 举报

发表于 2009-9-12 00:09:28 | 显示全部楼层
Post by swordhui;2026092
感谢tusooa.
find在找到文件后, 确实可以执行一些命令, 如打印文件信息啥的. 然后调用md5sum也可以.
我研究一下, 实在不行就find+md5sum吧...

删除就用gawk+rm...

先删链接, 再删文件, 然后是目录.

对校验来说... 效率高些还是很重要.

继续征集C语言代码一周... 下周我完成build脚本改造后, 如果还征不到代码, 就自己动手了...


等这两天忙完了和你仔细交流一下,看看程序需求,能不能做下来,能做就试试看,好久没写过了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表