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/ ",depth," ",entry->d_name); 39. printdir(entry->d_name,depth+4); 40. } 41. else 42. printf("%*s%s ",depth," ",entry->d_name); 43. } 44. 45. chdir(".."); 46. closedir(dp); 47. } 48. else 49. { 50. fprintf(stderr,"cannot open directory: %s ",dir); 51. return; 52. } 53.} 54. 55.int main() 56.{ 57. printf("Directory scan of /home: "); 58. printdir("/home",0); 59. printf("Success! "); 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