当前位置:  技术问答>linux和unix

Linux下C++开发的问题

    来源: 互联网  发布时间:2015-10-15

    本文导语:  在LINUX下面如何用C++写程序实现打印指定目录文件夹里面的所有文件,并将文件名保存 | 转一个cu上的文章 作者:wwwunix  近来,随着UNIX系统的不断普及,使用UNIX系统的单位和个人也越来越...

在LINUX下面如何用C++写程序实现打印指定目录文件夹里面的所有文件,并将文件名保存

|
转一个cu上的文章
作者:wwwunix 

近来,随着UNIX系统的不断普及,使用UNIX系统的单位和个人也越来越多,特别是Linux的推出,更是风靡全球。基于UNIX系统的编程也愈显重要。本文以一个简单的程序为例,说明怎样在UNIX系统下对文件和目录进行编程。该例是一个类似于UNIX系统命令ls的程序,用于列出指定的目录中所有文件和子目录并计算出指定目录所用的磁盘空间。 

UNIX文件系统简介  
文件是通过操作系统来管理的。文件的结构以及命名、存取、使用、保护和实现方法都是UNIX系统中的重要内容。总体上,UNIX系统中处理文件的那部分称为文件系统。同DOS类似,UNIX中的文件系统被组织成树状结构。 

UNIX中的文件和目录通过一个9比特的保护码来进行保护。保护码分成三个3比特的域,分别对应着文件主、同组用户和其他用户。每个域有一位标识读权限,一位标识写权限,一位标识执行权限,这三位即rwx位。 

在UNIX文件系统中通常包含如下文件类型: 

普通文件:一个文件包含所有用户放在其中的信息。它可以被认为是一个字节序列。它与DOS及WINDOWS系统不同,对于每个文件都具有一定的读写权限。  
目录:目录提供了文件名称与文件自身之间的映射,由此使得文件系统上的一个结构被作为一个整体对待。一个目录可包含文件,也可以包含子目录,这些子目录同样可以包含更多的文件和子目录。一个目录在被读的时候,它的行为完全像一个普通文件,但它不能被没有权限的用户程序访问。  
特殊文件:特殊文件是UNIX文件系统中最有特色的地方之一。每个I/O设备(磁盘驱动器、终端等)都与一个这样的文件有关。对特殊文件的操作和普通文件一样,但它引发了对相关设备的操作。特殊设备文件的实体保存在目录/dev中。  
符号链接文件:一个符号链接在行为上就像指向另一个文件的指针,这有点像C语言中的指针。在文件系统中,实现这一点是建立一个带有链接名称的文件,该链接指向文件的路径名。  
I标识号,I列表和I节点:一个目录是由一系列结构组成的,每个结构包含有一个文件名和一个指向文件自身的指针,该指针是一个整数,称为文件的I标识号。当文件被访问时,它的I标识号用来作为索引打开一个系统表(I列表),系统表中存放着文件(I节点)的实体。I节点中包含了如下对文件的描述信息:  
.文件自身的用户和用户组ID 

.文件的保护码 

.文件内容所在的物理磁盘地址 

.文件的大小 

.最后一次I节点改变的时间,最后一次使用和最后一次修改的时间 

.连接该文件的次数,即它出现在其它目录中的次数 

.一个指明文件类型的标记(目录、普通文件或特殊文件) 

有关的系统调用介绍  
lstat系统调用:这是一个非常有用的系统调用,用来获取存储在一个I节点上的信息。它接受两个参数:一个字符串指针,指向说明一个文件的路径名;另一个是指向stat结构的指针,在这个结构中,存放着有关这个文件的信息。Stat结构包括以下成员:  
st_mode:这个字段包含文件类型和它所具有的访问权限  
st_ino:这个字段在一个给定的文件系统中唯一的标识了这个文件 

st_dev:这个字段唯一地标识了包括这个文件的文件系统 

st_rdev:如果I节点是一个特殊设备文件,则这个字段标识设备的类型 

st_nlink:文件链接的个数 

st_uid:文件属主的用户ID 

st_gid:文件的用户组的组ID 

st_size:文件的字节数 

st_atime:文件数据最近一次被访问的时间 

st_mtime:文件数据最近一次被更改的时间 

st_ctime:文件状态最近一次被修改的时间 

opendir:它打开一个指定的目录,并返回一个DIR类型的指针。DIR数据类型包含如下两个元素:  
d_ino:文件I标识号,如果文件被删除,则d_ino为0  
d_name:此目录下包含的文件名 

readdir:它读出指定目录中的一个文件或子目录,并将指针移到下一个文件或子目录。  
closedir:关闭相应的目录。  
程序说明  
该程序是一个类似于UNIX命令ls 的小工具(取文件名为lx,为了简单起见,此程序只读取了文件的字节数,即st_size)。它可以接受一个参数:指定的目录;也可以不带参数,则默认为当前目录。程序列出指定目录及其子目录中所包含的所有文件的文件名和文件的字节数,并计算出指定目录所占磁盘空间的大小。程序详细说明如下(程序清单见附录): 

1-5行:包含在程序中要用到的一些头文件。 

6行:定义常数TABSPACES为TAB键所跳过的空格数,用于规整后面显示语句的屏幕格式。 

11行:定义一个变量dir_size用于存放指定目录所占磁盘空间的大小。 

12、13行:判断命令行如果没有带参数,则调用list函数,将指定目录置为当前目录,并将返回的目录大小存入变量dir_size中。 

14-18行:如果命令行带的参数大于一个,则在屏幕上显示出此命令的简要语法并退出程序。 

19、20行:如果命令行只带一个参数,则将此参数作为指定目录调用list函数,同时也返回目录的大小并存入变量dir_size中。 

21行:打印出指定目录及其子目录所占磁盘空间的大小。 

23行:定义list函数,该函数采用递归法列出字符串name所指定的目录及其子目录中所包含的文件名和文件的大小,并计算name所指定的目录所占用的磁盘空间。 

26-32行:定义函数中要用的变量并赋初值。 

33行:打印当前所操作目录的目录名。 

34行:开始一个循环次数为2的for循环。第1次循环找出目录中包含的所有文件,第2次循环找出目录中包含的所有子目录。 

36-40行:打开指定的目录,如果打开成功则返回指向此目录的指针,否则返回NULL。程序打印出出错信息并退出。 

41行:开始一个while循环,每循环一次读出目录中的一个文件或子目录,直到读出目录中所有的文件或子目录,readdir返回NULL表示已读到此目录的尾部。 

43、44行:判断读出的文件的I标识号,如果为0,则表示该文件已被删除。程序继续执行并读取下一个文件。 

45-47行:在读出的文件名前加上绝对或相对路径,以使程序能正确的从文件系统中访问指定的文件。 

48-52行:调用lstat获取指定文件的信息,将获取的信息存储到结构sbuf中。如果出错则退出程序。 

53行:判断读出的文件是否是一个目录,这个条件用语句(sbuf.st_mode&S_IFMT)==S_IFDIR实现。其它三个条件用于滤除符号链接、目录本身和上一级目录,以避免出现死循环。 

55-60行:如果是第2次for循环则递归调用list函数,列出相应的子目录,同时累加目录所占磁盘空间的大小。 

63-71行:如果是第1次for循环则打印出文件名和文件所占用的字节数,同时累加所占磁盘空间的大小。用三条打印语句是因为文件名长度不一致,为了打印出的屏幕美观。 

75行:关闭相应的目录。 

77行:返回本目录所占用的磁盘空间。 

本程序在Turbo Linux 4.0和FreeBSD 3.0上调试运行通过。 

参考资料:《UNIX系统程序员进阶》 林新观编著清华大学出版社 

《UNIX系统V/386第4版程序员参考手册》 电子工业出版社 

附录:程序lx.c 

1 #include  

2 #include  

3 #include  

4 #include  

5 #include  

6 #define TABSPACES 8 

7 main(argc,argv) 

8 int argc; 

9 char **argv; 

10 { 

11 off_t dir_size; 

12 if (argc2) 

15 { 

16 printf("Usage: lx [path]n"); 

17 exit(1); 

18 } 

19 else 

20 dir_size=list(argv[1]); 

21 printf(" This directory size is %i bytes.n",dir_size); 

22 } 

23 off_t list(name) 

24 char *name; 

25 { 

26 char pn[255]; 

27 DIR *dp; 

28 off_t f_size,d_size; 

29 int i; 

30 struct stat sbuf; 

31 struct direct *dir; 

32 f_size=0; 

33 printf("Current directory is %sn",name); 

34 for (i=0;id_ino==0) 

44 continue; 

45 strcpy(pn,name); 

46 strcat(pn,"/"); 

47 strcat(pn,dir->d_name); 

48 if (lstat(pn,&sbuf)d_name,".")!=0)&&(strcmp(dir->d_name,"..")!=0)) 

54 { 

55 if (i==1) 

56 { 

57 d_size=list(pn); 

58 f_size=f_size+d_size; 

59 } 

60 } 

61 else 

62 { 

63 if (i==0) 

64 { 

65 f_size=f_size+sbuf.st_size; 

66 if (strlen(dir->d_name)>=2*TABSPACES) 

67 printf("%st%in",dir->d_name,sbuf.st_size); 

68 else if (strlen(dir->d_name)>=TABSPACES) 

69 printf("%stt%in",dir->d_name,sbuf.st_size); 

70 else 

71 printf("%sttt%in",dir->d_name,sbuf.st_size); 

72 } 

73 } 

74 } 

75 closedir(dp); 

76 } 

77 return f_size; 

78 }

|
opendir

    
 
 

您可能感兴趣的文章:

  • Linux 下c++开发error while loading shared libraries问题解决
  • 我常未开发过Linux下的程序,请问Linux下可以使用那些开发工具,最好的开发工具是什么版本?
  • Linux下c/c++开发之程序崩溃(Segment fault)时内核转储文件(core dump)生成设置方法
  • 嵌入式linux开发与防火墙系统linux开发
  • embedded linux开发和linux开发 要求的知识领域有什么不同?
  • linux下用java开发是不是JB就可以,JAVA在LINUX下开发有优势吧!
  • linux 嵌入式开发用不用买开发板,买什么样的开发板?
  • 谁知道国内有那些公司在linux平台上做开发的,或开发linux软件的?
  • 作 Linux/Unix开发 应该从何处入手?致力于Linux开发的迷惑???欢迎讨论。
  • 我是学习web开发的,主要是java开发SSH开发框架和ajax等。我想知道有没有必要学习一下linux相关知识。
  • 请问在Linux 下用C开发移动增值软件都有什么开发工具啊,我以前一直在Windows下用VC开发
  • 请问大家 在linux下开发嵌入式linux用什么集成开发环境?
  • linux 嵌入式开发用买开发板吗?
  • 请问LINUX下开发大家一般都是什么开发环境?
  • 我想在Linux下开发,不知道用什么工具、什么开发语言??
  • 各位设备驱动开发的朋友,请问,linux设备驱动开发和网络编程开发哪一样工资比较高呀?
  • 强烈建议将linux/Unix栏目放到“软件开发者”大类里面来。----Unix开发的人助威支持!!!
  • 关于linux内核开发和应用开发的区别
  • 学习linux驱动开发,买什么开发板好?
  • 请问在哪下载嵌入式Linux开发平台???想学嵌入式开发!!!
  • 从windows开发转Linux开发 的前辈请进!!!
  • Linux下时钟同步问题:Clock skew detected原因分析及解决方法
  • linux 繁体 汉字输入法 问题 linux 繁体 汉字输入法 问题
  • 先安装linux,后安装winxp,能否解决正常启动linux的问题不?(初学者问题,很容易回答)
  • 弱弱的一问,linux下的中文问题及网络问题,分不是问题
  • Linux新手问,Linux安装问题。
  • linux下游戏问题。(菜鸟问题)
  • 初学Linux,发现Linux下的版本问题很头痛。【系列问题】
  • 高深问题:有了linux内核源代码如何做成一个linux操作系统
  • 一个很菜的问题,关ARM与linux内核裁剪的问题!
  • vmware装的linux,通过win2000访问linux的web服务器有问题
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux c/c++ IP字符串转换成可比较大小的数字
  • 在win分区上安装linux和独立分区安装linux有什么区别?可以同时安装吗?(两个linux系统)
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 在虚拟机上安装的linux上,能像真的linux系统一样开发linux程序么?
  • secureCRT下Linux终端汉字乱码解决方法
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在有linux的盘)
  • Linux c字符串中不可打印字符转换成16进制
  • 安装vmware软件,不用再安装linux系统,就可以模拟linux系统了,然后可以在其上学习一下LINUX下的基本操作 了?
  • Linux常用命令介绍:更改所属用户群组或档案属性
  • unix/linux知识 iis7站长之家
  • linux命令大全详细分类介绍及常用linux命令文档手册下载
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在没有linux的盘,只有DOS启动盘)
  • Linux Kernel 'sctp_v6_xmit()'函数信息泄露漏洞
  • 如何让win2000和linux共存。我装好WIN2000,再装LINUX7.0,但LILO只能找到LINUX,不能引导WIN2000
  • linux c下利用srand和rand函数生成随机字符串
  • 在windows中的VMware装了个linux,主板有两个串口,能做windows和linux的串口通信测试么,怎么测试这两个串口在linux是有效
  • Linux c++虚函数(virtual function)简单用法示例代码
  • 我们网站的服务器从windows2000迁往linux,ASP程序继续使用,可是我连LINUX的皮毛都不了解,大家告诉我LINUX下怎么建网站??
  • Docker官方镜像将会使用Alpine Linux替换Ubuntu
  • 中文Linux与西文Linus分别哪一个版是权威?I认为是:中科软的白旗Linux与西文的绿帽子Linux!大家的看法呢?
  • Linux下chmod命令详细介绍及用法举例
  • 我重装了winme,却进不了Linux了,而我现在又没有Linux光盘,也没有Linux启动盘,还有没有办法?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3