Chinaunix首页 | 论坛 | 博客
  • 博客访问: 61794
  • 博文数量: 9
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 318
  • 用 户 组: 普通用户
  • 注册时间: 2014-01-22 16:06
文章分类
文章存档

2014年(9)

分类: LINUX

2014-03-01 11:28:34

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
    
#include
#include
#include
#include
#include
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; /* 最后状态改变时间 */
};
阅读(2066) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~