二、文件与目录

struct stat
{
    mode_t             st_mode;        //权限位
    ino_t              st_ino;         //i-node number
    dev_t              st_dev;
    dev_t              st_rdev;
    nlink_t            st_nlink;       //number of hard links
    uid_t              st_uid;
    gid_t              st_gid;
    off_t              st_size;       //普通文件长度(byte)
    struct timespec    st_atime;
    struct timespec    st_mtime;
    struct timespec    st_ctime;
    blksize_t          st_blksize;    //以block块(4094byte)计数
    blkcnt_t           st_blocks;     //以扇区(512byte)计数
}
  • st_mode 参数详解
    这里写图片描述

  • 函数说明

    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
int open(char *pathName, int oflg, /* mode_t mode */);  返回文件描述符

    #include <unistd.h>
int close(int fd);  关闭文件

    #include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);  从fd中读取count个字节放在以内存首地址为buf上,
                                                成功返回读取到的字节数,读到文件末尾返回0。失败返回-1#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);  把内存以 buf为首地址,count个字节写进fd中,
                                                         返回写成功的字节数。
    #include <sys/types.h>
    #include <sys/stat.h>
    mode_t umask(mode_t mask);   更改uamsk的值。

最大文件打开个数
    系统最大文件打开个数  cat /proc/sys/fs/file-max
    默认最大文件打开个数  ulimit -a
    更改默认最大文件打开个数  ulimit -n 4096

    #include <errno.h>
void perror(const char *s);  打印出错信息

    #include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);

    #include <fcntl.h>
int fcntl(int fd, int cmd, ... /* int arg */);   改变已经打开的文件的访问控制属性

    #include <unistd.h>
    #include <sys/ioctl.h>
int ioclt(int fd, int request, ...);  向设备文件发送控制或配置指令,更改一些物理访问控制属性杂项函数。

    #include <sys/types.h>
    #include <sys/stat.h>
    #include <unistd.h>
int stat(cost char *path, struct stat *buf);        主要功能获取文件的inode属性。
int fstat(int fd, struct stat *buf);
int lstat(const char *path, struct stat *buf);       不跟随符号链接,返回符号链接的有关信息,二不是符号链接所引用的文件信息

    #include <unistd.h>
int access(const char*pathname, int mode);  按实际UID、GID,跟踪符号链接。测试一个文件是否有访问权限,
                                            成功返回0;出错,返回-1
                                            mode参数:
                                                R_OK:读权限
                                                W_OK:写权限
                                                X_OK:执行权限
                                                F_OK:是否存在  

    #include <sys/stat.h>
int chmod(const char *path, mode_t mode);    改变权限

    #include <unistd.h>
int unlink(const char *pathname);      功能:(1)如果是符号链接,删除符号链接
                                            (2)如果是硬链接,硬链接个数减1,
                                            (3)如果硬链接为0,但有进程已打开该文件,
                                               并持有文件描述符,则等进程关闭该文件时,
                                               kernel 才真正去删除该文件
                                            (4)利用该特性创建临时文件,
                                               先open()  或 creat() 创建一个文件,
                                               马上unlink()此文件

硬链接不允许跨文件系统,而POSIX可以跨文件系统,
目录不可以创建硬链接,因为给目录创建硬链接会形成死循环

    #include <unistd.h>
int chdir(const char pathname);         改变当前工作目录

    #include<unistd.h>
char *getcwd(char *buf, size_t size);   获取当前工作目录,成功,返回buf;失败,返回NULL

    #include <sys/types.h>
    #include <sys/stat.h>
int mkdir(const char *pathname, mode_t mode);       创建一个目录

    #include <unistd.h>
int rmdir(const char *pathname);    删除一个目录

    #include <sys/types.h>
    #include <dirent.h>
DIR *opendir(const char *pathname);     打开一个目录
int closedir(DIR *dp);      关闭打开的目录
struct dirent * readdir(DIR *dp);       每次返回一个记录项,然后指向下一个记录项
                                        到达目录末尾,返回NULL,此时不设置errno,
                                        当出错,返回NULL,errno被设置。
void rewinddir(DIR *dp);        将记录项指针重置为指向第一项
long telldie(DIR *dp);          返回当前目录指针在什么位置
void seekdir(DIR *dp, long loc);        设置目录指针位置
  • 我的遍历文件层次结构程序
/*
* 在Linux下搜索目录下文件及其子目录文件
* 算法是先进入该目录,找到第一个记录项,查看是否为目录。是,进入该目录并重复上述,不是,返回上级目录
*/

#include <unistd.h>
#include <sys/stat.h>
#include <dirent.h>

#include <stdio.h>
#include <stdlib.h>

void sys_err(char *funcname);
void showDir(int i);

int main(int argc, char *argv[])
{
    if(argc != 2)
    {
        printf("argc not equal 2.\n");
        exit(-1);
    }

    if(access(argv[1], F_OK) < 0)
        sys_err("access()");

    if(chdir(argv[1]) < 0)
        sys_err("chdir()");

    showDir(0);

    return 0;
}

void sys_err(char *funcname)
{
    perror(funcname);
    exit(-1);
}



void showDir(int i)
{
    DIR *dirP;
    struct dirent *direntP;
    struct stat buf;

    if((dirP = opendir(".")) == NULL)
        sys_err("opendir()");

    while((direntP = readdir(dirP)) != NULL)
    {
        if(direntP->d_name[0] == '.')
            continue;

        if(lstat(direntP->d_name, &buf) < 0)
            sys_err("lstat()");
        int j = 0;  
        for(; j < i; j++)
            printf(" ");    
        printf("%s",direntP->d_name);

        if(S_ISDIR(buf.st_mode))
        {
            printf("/\n");
            if(chdir(direntP->d_name) < 0)
                sys_err("chdir()");
            showDir(i + 1);
        }
        else
            printf("\n");
    }
    chdir("..");
    closedir(dirP);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值