歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Linux下遞歸遍歷目錄和文件

Linux下遞歸遍歷目錄和文件

#include<stdio.h>
#include<stdlib.h>
#include<dirent.h>
#include<string.h>
#include<sys/stat.h>
void printdir(char *dir,int depth)
{
        //打開目錄指針
    DIR *Dp;
        //文件目錄結構體
    struct dirent *enty;
        //詳細文件信息結構體
    struct stat statbuf;
    //打開指定的目錄,獲得目錄指針
    if(NULL == (Dp = opendir(dir)))
    {
        fprintf(stderr,"can not open dir:%s\n",dir);
        return;
    }
        //切換到這個目錄
    chdir(dir);
        //遍歷這個目錄下的所有文件
    while(NULL != (enty = readdir(Dp) ))
    {
                //通過文件名,得到詳細文件信息
        lstat(enty->d_name,&statbuf);
                //判斷是不是目錄
        if(S_ISDIR(statbuf.st_mode))
        {
                        //當前目錄和上一目錄過濾掉
            if(0 == strcmp(".",enty->d_name) ||
                          0 == strcmp("..",enty->d_name))
            {
                continue;
            }
                        //輸出當前目錄名
                printf("%*s%s/\n",depth," ",enty->d_name);
        //繼續遞歸調用        printdir(enty->d_name,depth+4);
        }
        else
        {      //輸出文件名
            printf("%*s%s\n",depth," ",enty->d_name);
        }
    }
        //切換到上一及目錄
    chdir("..");
        //關閉文件指針
    closedir(Dp);
}
int main(int argc,char **argv)
{
    char *topdir = "/home/administrator/桌面/test";
    if(argc > 2)
    {
        printf("it is in here\n");
        topdir = argv[1];
    }
    printf("Directory scan of %s\n",topdir);
    printdir(topdir,0);
    printf("Done\n");
    exit(0);
}

 

 

 

struct dirent
{
long d_ino; /* inode number 索引節點號 */
off_t d_off; /* offset to this dirent 在目錄文件中的偏移 */
unsigned short d_reclen; /* length of this d_name 文件名長 */
unsigned char d_type; /* the type of d_name 文件類型 */
char d_name [NAME_MAX+1]; /* file name (null-terminated) 文件名,最長256字符 */
}

 


函數名: lstat
功 能: 獲取一些文件相關的信息
用 法: int lstat(const char *path, struct stat *buf);
參數:
path:文件路徑名。
filedes:文件描述詞。
buf:是以下結構體的指針
struct stat {
dev_t st_dev; /* 文件所在設備的標識 */
ino_t st_ino; /* 文件結點號 */
mode_t st_mode; /* 文件保護模式 */
nlink_t st_nlink; /* 硬連接數 */
uid_t st_uid; /* 文件用戶標識 */
gid_t st_gid; /* 文件用戶組標識 */
dev_t st_rdev; /* 文件所表示的特殊設備文件的設備標識 */
off_t st_size; /* 總大小,字節為單位 */
blksize_t st_blksize; /* 文件系統的塊大小 */
blkcnt_t st_blocks; /* 分配給文件的塊的數量,512字節為單元 */
time_t st_atime; /* 最後訪問時間 */
time_t st_mtime; /* 最後修改時間 */
time_t st_ctime; /* 最後狀態改變時間 */
};

Copyright © Linux教程網 All Rights Reserved