【APUE】文件和目录

 

  • state fstate lstate函数
 
#include<sys/stat.h>
int stat(const char* restrict pathname, stuct state *restrict buf);返回与此命名文件有关的
int fstat(int fieldes, struct state *buf);返回描述符上打开文件的信息
int lstat(const char *restrict pathname, struct state *restrict buf);和state类似,但是当文件时个符号链接时,返回该符号链接的有关信息
 
struct stat是一个结构体,里面的成员表示文件的各个方面的信息
 
#include"apue.h"
int main(int argc, char *argv[])
{
    int i;
    struct stat buf;
    char *ptr;
    for(i = 1; i < argc; i++)
    {
        printf("%s", argv[i]);
        if(lstat(argv[i], &buf) < 0)
        {
            printf("error\n");
            continue;
        }
        if(S_ISREG(buf.st_mode))
            ptr = "regular";
        else if(S_ISDIR(buf.st_mode))
            ptr = "directory";
        else if(S_ISCHR(buf.st_mode))
            ptr = "character special";
        else if(S_ISBLK(buf.st_mode))
            ptr = "block special";
        else if(S_ISFIFO(buf.st_mode))
            ptr = "fifo";
        else if(S_ISLNK(buf.st_mode))
            ptr = "symbolic link";
        else if(S_ISSOCK(buf.st_mode))
            ptr = "socket";
        else
            ptr = "unknown";
        printf("%s\n", ptr);
    }
    return 0;
}

 

 
 
  • 文件访问权限
st_mode值也包括了针对文件的访问权限,所有文件类型都有访问权限
 
int access(const char *pathname, int mode);测试文件的权限
mode_t umask(mode_t cmask);为进程设置文件模式创建屏蔽字,返回之前的文件模式创建屏蔽字
 
 
int chmod(const char *pathname, mode_t mode);
int fmode(int fieldes, mode_t mode);
更改现有文件的访问权限,出错返回-1
 
 
 
  • 文件长度
stat结构体成员st_size表示文件的长度,只对普通文件目录文件和符号链接(长度为文件名中的实际字节数)有意义。
 
 
 
  • 文件系统
i节点是固定长度的记录项,他包含有关文件的大部分信息
 
每个i节点中都有一个链接计数,其值是指向该i节点的目录项数,只有当链接计数减少至0时,才可以删除该文件,因此解除一个文件的链接不等于释放该文件占用的磁盘块。
在stat中,链接计数包含在st_nlink成员中, 这被称为硬链接。
符号链接或者是软连接,文件的实际内容包含了该符号链接指向的文件的名字。
 
 
i节点包含了大多数与文件有关的信息,文件类型,文件访问权限位,文件长度和指向该文件所占用的数据块的指针等等。stat结构中的大多数信息采集自i节点。只有两项数据存放在目录项中,文件名和i节点编号。
 
 
在不更换文件系统的情况下为文件更名时,该文件的实际内容未改变,只需要构造一个指向现有i节点的新目录项,并解除与旧目录项的链接。
 
 
 
  • getcwd函数
#include<unistd.h>
char *getcwd(char *buf, size_t size); 若成功就返回buf出错返回null
从当前目录开始,用..找到上一级目录,然后读取目录项,知道该目录项中的i节点编号与工作目录i节点编号一致,这样就找到了其对应的文件名,这样一致上升知道根节点,就获得了当前目录的完整路径。
#include"apue.h"
int main()
{
    char ptr[100];
    if(getcwd(ptr, 100)==NULL)
    {
        printf("error\n");
        exit(-1);
    }
    printf("%s\n", ptr);
    return 0;
}

 

 
posted @ 2012-09-14 15:48  w0w0  阅读(278)  评论(0编辑  收藏  举报