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下文件及目录的一些操作(附递归遍历目录源码)的更多相关文章

  1. linux下文件压缩与解压操作

    对于刚刚接触Linux的人来说,一定会给Linux下一大堆各式各样的文件名给搞晕.别个不说,单单就压缩文件为例,我们知道在Windows下最常见的压缩文件就只有两种,一是,zip,另一个是.rap.可 ...

  2. Windows与Linux下文件操作监控的实现

    一.需求分析: 随着渲染业务的不断进行,数据传输渐渐成为影响业务时间最大的因素.究其原因就是因为数据传输耗费较长的时间.于是,依托于渲染业务的网盘开发逐渐成为迫切需要解决的需求.该网盘的实现和当前市场 ...

  3. linux下文件的复制、移动与删除

    linux下文件的复制.移动与删除命令为:cp,mv,rm 一.文件复制命令cp     命令格式:cp [-adfilprsu] 源文件(source) 目标文件(destination)      ...

  4. 学习笔记12—linux下文件的复制、移动与删除

    查看centOS 版本     cat /etc/redhat-release 1,复制粘贴文件 cp  [选项]  源文件或目录  目标文件或目录 2,剪切粘贴文件 mv [选项]  源文件或目录 ...

  5. linux 下文件重命名/移动/复制命令(转)

    linux 下文件重命名/移动/复制命令(转) linux下重命名文件:使用mv命令就可以了, 例:要把名为:abc   重命名为:123 可以这样操作: 重命名:MV命令 1.进入你的文件目录,运行 ...

  6. (转)linux下文件删除的原理精华讲解(考试题答案系列)

    linux下文件删除的原理精华讲解(考试题答案系列) 说明:本文为老男孩linux培训某节课前考试试题及答案分享博文内容的一部分,也是独立成题的,你可以点下面地址查看全部的内容信息.http://ol ...

  7. linux下文件的打包和压缩

    文章来源:linux下文件的打包和压缩 目录 一.文件压缩的原理 二.linux常见的压缩指令 三.常用实例 1.tar命令 2.zip命令 3.gz命令 4.bz2命令 5.xz命令(必须分两步) ...

  8. Linux下文件的三种时间戳

    Linux下文件的三种时间标记 三种时间对应关系表 column column column 访问时间 Access atime 修改时间 Modify mtime 状态改动时间 Change cti ...

  9. linux下文件结束符

    linux下文件结束符,我试过了所有的linux,发现其文件的结束符都是以0a即LF结束的,这个是操作系统规定的,windows下是\r\n符结束,希望可以帮助大家. -------------转:来 ...

随机推荐

  1. 量身定制顺美男女西服、衬衫、大衣、T恤等 - 北京58同城

    量身定制顺美男女西服.衬衫.大衣.T恤等 - 北京58同城 量身定制顺美男女西服.衬衫.大衣.T恤等 发布时间:2014-04-11浏览2次

  2. http multipart/form-data POST文件上传详解

    POST /test/index.php HTTP/1.1 User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:26.0) Gecko/20100101 Firef ...

  3. mybatisnet轻量级ORM框架

    https://code.google.com/p/mybatisnet/source/checkout http://blog.csdn.net/arvinstudy/article/details ...

  4. 固定cell.imageView.image的大小

    cell.imageView.image的大小 会随着Cell的高度而变化,不同的图片显示的也不一样,在网上找了几种方法,简单方便的是下面这种: UIImage *icon = [UIImage im ...

  5. 一个tabBarController管理多个Storyboard

    随着项目的业务逻辑越来越复杂,随着项目越来越大,那么我们Storybard中得控制器就越来越多, 就越来越难以维护.然而使用Storyborad又能更方便的帮助我们做屏幕适配(PS:尤其在6.6+出来 ...

  6. 10个Laravel4开发者必用扩展包

    Laravel是一个新的基于最新PHP版本号语法,支持IoC等设计模式的高速开发框架.眼下最新版本号为4.2,推荐安装PHP版本号5.5+. 本文列举10个基本软件包,都是开发人员使用Laravel框 ...

  7. python单/双下划线使用

    在Python编程中经常会遇到函数(function),方法(method)及属性(attribute)以下划线'_'作为前缀,这里做个总结. 主要存在四种情形: 1. object # public ...

  8. oracle 命令创建用户 、授权、数据库导入、导出

    最近在使用oracle,经常要导入导出数据,命令很简单,却经常忘记,所以记下来.. drop user yfplss cascade;--登录system用户删除已存在的用户名,该用户下的所有东西都被 ...

  9. Properties文件的XML格式(转)

    想必大家都用过*.properties文件,作为配置文件.但是,如果该文件写入了中文,待编译后内容就会成为乱码,使用native命令也好.使用ant执行编码转换也好,多少有点麻烦,与其如此,我们不如直 ...

  10. PagerAdapter instantiateItem()方法position错误解决方案

    异常信息:java.lang.IndexOutOfBoundsException: index=3 count=2 在instantiateItem各个条目View的时候.会有 container.a ...