文件管理相关系统编程(4)

综合例子
#include<fcntl.h>
#include<sys/stat.h>
#include<unistd.h>
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<dirent.h>
#include<stdlib.h>
typedefenum {
    false = 0, true = 1
} bool;
voidprintFileInfo(struct stat* buf) {
    bool userall = false;
    printf("文件权限是:%o. 详细信息如下:\n", (buf->st_mode& 0x0fff));
    if (buf->st_mode& S_IRWXU) {
        userall = true;
        printf("所有者拥有读写执行权限\n");
    }
    if (buf->st_mode& S_IRWXG) {
        printf("用户组拥有读写执行权限\n");
    }
    if (buf->st_mode& S_IRWXO) {
        printf("其他人拥有读写执行权限\n");
    }
    if (userall) {
        if (buf->st_mode& S_IRUSR) {
            printf("所有者拥有读权限\n");
        }
        if (buf->st_mode& S_IWUSR) {
            printf("所有者拥有写权限\n");
        }
    }
    if (buf->st_mode& S_IFREG) {
        printf("文件是一个普通文件\n");
    }
    if (buf->st_mode& S_ISUID) {
        printf("文件设置了SUID权限\n");
    }
    if (buf->st_mode& S_ISGID) {
        printf("文件设置了GUID权限\n");
    }
    printf("UID=%d\n", buf->st_uid);
    printf("GID=%d\n", buf->st_gid);
    printf("占用block=%ld\n", buf->st_blocks);
    printf("block大小=%ld\n", buf->st_blksize);
    printf("最后访问时间=%ld\n", buf->st_atim.tv_sec);
    printf("最后状态更新时间=%ld\n", buf->st_ctim.tv_sec);
    printf("最后修改时间=%ld\n", buf->st_mtim.tv_sec);
}
intOpenFile(constchar *fpath) {
    unlink(fpath);
    int f = open(fpath, O_RDWR);
    if (f == -1) {
        f = creat(fpath, S_IWUSR | S_IRUSR);
        if (f != -1) {
            printf("创建一个文件\n");
        } else {
            printf("无法创建文件\n");
            return -1;
        }
    } else {
        printf("文件打开成功\n");
    }
    return f;
}
voidscan_dir(constchar* dir, int depth) {
    DIR *dp;
    struct dirent* entry;
    if ((dp = opendir(dir)) == NULL) {
        printf("无法打开目录:%s\n", dir);
        return;
    }
    struct stat statbuf;
    chdir(dir);
    while ((entry = readdir(dp)) != NULL) {
        constchar* name = entry->d_name;
        lstat(name, &statbuf);
        if (S_IFDIR & statbuf.st_mode) {
            if (strcmp(".", entry->d_name) == 0
                    || strcmp("..", entry->d_name) == 0) {
                continue;
            }
            printf("%*s%s:%o\n", depth, "", entry->d_name,
                    (statbuf.st_mode& 0x0fff));
            scan_dir(entry->d_name, depth + 4);
        } else {
            printf("%*s%s:%o\n", depth, "", entry->d_name,
                    (statbuf.st_mode& 0x0fff));
        }
    }
    chdir("..");
    closedir(dp);
}
intmain() {
    constchar *fpath = "test";
    int f = OpenFile(fpath);
    struct stat *buf = malloc(sizeof(struct stat));
    fstat(f, buf);
    printf("===================================================\n");
    printFileInfo(buf);
    printf("===================================================\n");
    close(f);
    sleep(1);
    chmod("test", 7777);
    printf("更改文件权限为7777\n");
    stat("test", buf);
    printf("===================================================\n");
    printFileInfo(buf);
    printf("===================================================\n");
    free(buf);
    printf("==================扫描文件夹============================\n");
    scan_dir("/home", 0);
    umask(0011);
    mkdir("/tmp/mydir", 0777);
    creat("/tmp/mydir/myfile", 0777);
    printf("==================扫描文件夹==========================\n");
    scan_dir("/tmp/mydir", 0);
    chdir("/tmp");
    unlink("mydir/myfile");
    rmdir("mydir");
    return 0;
}

执行结果

创建一个文件

===================================================

文件权限是:600. 详细信息如下:

所有者拥有读写执行权限

所有者拥有读权限

所有者拥有写权限

文件是一个普通文件

UID=0

GID=0

占用block=8

block大小=4096

最后访问时间=1397539372

最后状态更新时间=1397539372

最后修改时间=1397539372

===================================================

更改文件权限为7777

===================================================

文件权限是:7141. 详细信息如下:

所有者拥有读写执行权限

用户组拥有读写执行权限

其他人拥有读写执行权限

文件是一个普通文件

文件设置了SUID权限

文件设置了GUID权限

UID=0

GID=0

占用block=8

block大小=4096

最后访问时间=1397539372

最后状态更新时间=1397539373

最后修改时间=1397539372

===================================================

==================扫描文件夹============================

.bashrc:644

.bash_logout:644

.mozilla:755

extensions:755

plugins:755

.nautilus:755

metafiles:700

目录创建成功

文件创建成功

==================扫描文件夹==========================

myfile:766

文件删除成功

目录删除成功

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/19069.html