Linux下文件及目录的一些操作(附递归遍历目录源码)
1.获取当前工作目录
#include <unistd.h>
1.char *getcwd(char *buf,size_t size);
2.
3.其中,buf为缓冲区地址,size为给出的最大路径名长度。如果当前工作目录的路径名长度大于给定的长度,则返回NULL并置errno为ERANGE。函数调用成功时,返回指向路径名的指针;否则返回NULL
4.
5.例:
6.char *name = new char[256];
7.if(getcwd(name,255)!=NULL)
8. cout<<"current dir is: "<<name<<endl;
9.delete [] name;
2. stat结构体
1.#include <sys/stat.h>
2.
3.struct stat
4.{
5. mode_t st_mode; //文件类型和权限信息
6. ino_t st_ino; //i结点标识
7. dev_t st_dev; //device number (file system)
8. dev_t st_rdev; //device number for special files
9. nlink_t st_nlink; //符号链接数
10. uid_t st_uid; //用户ID
11. gid_t st_gid; //组ID
12. off_t st_size; //size in bytes,for regular files
13. time_t st_st_atime; //最后一次访问的时间
14. time_t st_mtime; //文件内容最后一次被更改的时间
15. time_t st_ctime; //文件结构最后一次被更改的时间
16. blksize_t st_blksize; //best I/O block size
17. blkcnt_t st_blocks; //number of disk blocks allocated
18.}
1.获取文件stat结构体信息的三个函数
2.
3.#include <sys/types.h>
4.#include <sys/stat.h>
5.#include <unistd.h>
6.
7.int stat(const char *path, struct stat *buf);
8.int fstat(int fieldes, struct stat *buf);
9.int lstat(const char *path, struct stat *buf);
10.
11.成功则返回0,否则返回-1.
12.
13.其中,fstat的第一个参数int fields为文件的描述符。
14.fstat区别于另外两个系统调用的地方在于,fstat系统调用接受的是 一个“文件描述符”,而另外两个则直接接受“文件全路径”。文件描述符是需要我们用open系统调用后才能得到的,而文件全路径直接写就可以了。
15.
16.stat与lstat的区别:
17.
18.当文件是一个符号链接时,lstat返回的是该符号链接本身的信息;而stat返回的是该链接指向的文件的信息。可以这样记,lstat比stat多了一个l,因此它是有本事处理符号链接文件(link)本身的。
3.dirent结构体,可以只关注d_name字段
1.#include <dirent.h>
2.
3.struct dirent
4.{
5. long d_ino; /* inode number 索引节点号 */
6. off_t d_off; /* offset to this dirent 在目录文件中的偏移 */
7. unsigned short d_reclen; /* length of this d_name 文件名长 */
8. unsigned char d_type; /* the type of d_name 文件类型 */
9. char d_name [NAME_MAX 1]; /* file name (null-terminated) 文件名,最长255字符 */
10.}
4.读取目录的操作
1.//可能用到的函数
2.
3.#include <sys/types.h>
4.#include <dirent.h>
5.
6.DIR *opendir(const char *dirname);
7.struct dirent *readir(DIR *dirp);
8.void rewinddir(DIR *dirp);
9.int closedir(DIR *dirp);
10.
11.
12.//一个完整的递归遍历目录下子目录及文件的函数
13.
14.#include <unistd.h>
15.#include <stdio.h>
16.#include <dirent.h>
17.#include <string.h>
18.#include <stdlib.h>
19.
20.void printdir(char *dir, int depth)
21.{
22. DIR *dp;
23. struct direct *entry;
24. struct stat statbuf;
25.
26. if( (dp = opendir(dir))!=NULL )
27. {
28. chdir(dir); //changedir,进入dir目录
29. while( (entry = readdir(dp))!=NULL )
30. {
31. lstat(entry->d_name,&statbuf);
32.
33. if( S_ISDIR(statbuf.st_mode) )
34. {
35. if(strcmp(".",entry->d_name)==0 || strcmp("..",entry->d_name)
36. continue;
37.
38. printf("%*s%s/\n",depth," ",entry->d_name);
39. printdir(entry->d_name,depth+4);
40. }
41. else
42. printf("%*s%s\n",depth," ",entry->d_name);
43. }
44.
45. chdir("..");
46. closedir(dp);
47. }
48. else
49. {
50. fprintf(stderr,"cannot open directory: %s\n",dir);
51. return;
52. }
53.}
54.
55.int main()
56.{
57. printf("Directory scan of /home:\n");
58. printdir("/home",0);
59. printf("Success!\n");
60.
61. exit(0);
62.}
5.注意:判断文件是目录文件还是普通文件有两种方式
1.struct dirent *entry;
2.struct stat st;
3.
4.entry = opendir(dir);
5.lstat(entry->d_name,&st);
6.S_ISDIR(st.st_mode); //是目录文件则函数返回true
7.S_ISREG(st.st_mode); //是普通文件则函数返回true
8.
9.//S_ISDIR和S_ISREG均为宏定义,可参见sys/stat.h.
10.//或者用以下方式
11.(st.st_mode & S_IFMT)==S_IFDIR //目录文件为true
12.(st.st_mode & S_IFMT)==S_IFREG //普通文件为true
13.//其中S_IFMT在sys/stat.h中被定义为八进制数170000,通过与st_mode进行位的与操作可得类型,另有S_IFBLK、S_IFCHR、S_IFIFO类型
转载原文:http://blog.chinaunix.net/uid-25829053-id-2853278.html
Linux下文件及目录的一些操作(附递归遍历目录源码)的更多相关文章
- linux下文件压缩与解压操作
对于刚刚接触Linux的人来说,一定会给Linux下一大堆各式各样的文件名给搞晕.别个不说,单单就压缩文件为例,我们知道在Windows下最常见的压缩文件就只有两种,一是,zip,另一个是.rap.可 ...
- Windows与Linux下文件操作监控的实现
一.需求分析: 随着渲染业务的不断进行,数据传输渐渐成为影响业务时间最大的因素.究其原因就是因为数据传输耗费较长的时间.于是,依托于渲染业务的网盘开发逐渐成为迫切需要解决的需求.该网盘的实现和当前市场 ...
- linux下文件的复制、移动与删除
linux下文件的复制.移动与删除命令为:cp,mv,rm 一.文件复制命令cp 命令格式:cp [-adfilprsu] 源文件(source) 目标文件(destination) ...
- 学习笔记12—linux下文件的复制、移动与删除
查看centOS 版本 cat /etc/redhat-release 1,复制粘贴文件 cp [选项] 源文件或目录 目标文件或目录 2,剪切粘贴文件 mv [选项] 源文件或目录 ...
- linux 下文件重命名/移动/复制命令(转)
linux 下文件重命名/移动/复制命令(转) linux下重命名文件:使用mv命令就可以了, 例:要把名为:abc 重命名为:123 可以这样操作: 重命名:MV命令 1.进入你的文件目录,运行 ...
- (转)linux下文件删除的原理精华讲解(考试题答案系列)
linux下文件删除的原理精华讲解(考试题答案系列) 说明:本文为老男孩linux培训某节课前考试试题及答案分享博文内容的一部分,也是独立成题的,你可以点下面地址查看全部的内容信息.http://ol ...
- linux下文件的打包和压缩
文章来源:linux下文件的打包和压缩 目录 一.文件压缩的原理 二.linux常见的压缩指令 三.常用实例 1.tar命令 2.zip命令 3.gz命令 4.bz2命令 5.xz命令(必须分两步) ...
- Linux下文件的三种时间戳
Linux下文件的三种时间标记 三种时间对应关系表 column column column 访问时间 Access atime 修改时间 Modify mtime 状态改动时间 Change cti ...
- linux下文件结束符
linux下文件结束符,我试过了所有的linux,发现其文件的结束符都是以0a即LF结束的,这个是操作系统规定的,windows下是\r\n符结束,希望可以帮助大家. -------------转:来 ...
随机推荐
- docker网络-如何让外部网络访问容器资源
docker网络-如何让外部网络访问容器资源 安装httpd 服务: docker:/root# docker exec -it f63b2633d146 bash bash-4.1# yum ins ...
- C#性能优化实践【转】
性能主要指两个方面:内存消耗和执行速度.性能优化简而言之,就是在不影响系统运行正确性的前提下,使之运行地更快,完成特定功能所需的时间更短. 本文以.NET平台下的控件产品MultiRow为例,描述C# ...
- 《Qt编程的艺术》——8.2 显示目录层次
现在我们准备通过创建一个小程序来获得关于InterView的实践经验,使用QDirModel和拿来就用的view,来在四个不同的view中显示主目录,如图8.5所示.在代码里,除了例行公事先实例化一个 ...
- Linux 下编译Android-VLC开源播放器详解(附源码下载)
这两天需要做音视频播放相关的东西,所以重新找了目前android下的解码库.Android自带的解码库支持不全,因此很多第三方播放器都是自带解码器,绝大部分都是使用FFMpeg作为解码库.我11年的时 ...
- NET 人民币大写
/***** HongShijin** Me@HongShijin.com** 2009-3-15 10:13:00.00000** text/C#***/ /// <summary> / ...
- 今天是迅驰ORM的诞生之日。
欢迎各位朋友来造访,最主要还是那一点:版权所有,请尊重驰哥的著作版权,侵权必追究法律责任. 最后来一句刘德华的歌曲:独自去偷欢,我谢绝你监管!快乐心中常为我伴.
- 在EL表达式或者Struts标签库中格式化日期对象,即将Date转换为yyyy-MM-dd格式
一.EL表达式 首先,在jsp页面引入<fmt> tags,<%@ taglib prefix="fmt" uri="http://java.sun.c ...
- Struts2 初体验
Sturts是一款优雅的,可扩展性很强的框架.它是由Struts开发团队和WebWord团队合作,共同开发的一个新的产品.新版本的Struts2 更加容易使用,更加接近Struts所追求的理念.从开发 ...
- Can't load IA 32-bit .dll on a AMD 64-bit platform
在myeclipse中使用的,tomcat异常:java.lang.UnsatisfiedLinkError: D:\JAVA\ApacheTomcat\bin\tcnative-1.dll: Can ...
- javascirpt语法
1.区分大小写 ECMAScript中的一切(变量.函数名和操作符)都区分大小写,而函数名不能使用typeof,因为它是一个关键字,但typeof则完全可以是一个有效的函数名. 2.标识符 指变量.函 ...