unix下的文件和目录详解以及操作方法
unix下的⽂件和⽬录详解以及操作⽅法
前⾔:unix下⼀切东西都是⽂件,⼀共有7种不同的⽂件,前⼀篇博客已经讲解的很清楚了,不懂的可以看看。当然,博主知道有些朋友⽐忙,没时间看,那我就简单点讲讲这7种⽂件都有哪些吧。
⽂件类型包括在stat结构的st_mode成员中,下⾯是这7种⽂件类型的判断
⽅法:
宏⽂件类型
S_ISREG(m)                普通⽂件(is it a regular file?)
S_ISDIR(m)                  ⽬录⽂件(directory?)q宠大乐斗2怎么升级快
S_ISCHR(m)                字符特殊⽂件(character device?)
S_ISBLK(m)                  块特殊⽂件(block device?)
S_ISFIFO(m)                管道或FIFO [FIFO (named pipe)?]
S_ISLNK(m)                  符号链接 [symbolic link? (Not in POSIX.1-1996.)]
S_ISSOCK(m)              套接字 [socket? (Not in POSIX.1-1996.)]
当然这些⽂件都是有访问权限的,很巧这些权限也是在⼀个叫struct stat这个结构体中
结构体struct stat中的成员st_mode值包含了对⽂件的访问权限位,任何类型
的⽂件都有访问权限(access permission)。每个⽂件有9个访问权限,可
以它们分为3类,u表⽰⽤户(所有者)、g表⽰组、o表⽰其他
st_mode屏蔽含义
S_IRUSR                      ⽤户读
S_IWUSR                      ⽤户写
S_IXUSR                      ⽤户执⾏
S_IRGRP                        组读
S_IWGRP                        组写
S_IXGRP                      组执⾏
S_IROTH                      其他读
S_IWOTH                      其他写
S_ICOTH                      其他执⾏
那么问题来了既然有权限,我们怎么知道这些权限呢?当然这不是难事,⼀个access函数就可以解决问题了
函数描述:按实际⽤户ID和实际组ID进⾏访问权限测试
(1)头⽂件
#include <unistd.h>
(2)函数原型
int access(const char *path, int amode);
(3)参数
a、path:⽂件路径
b、amode:
F_OK:测试⽂件是否存在
R_OK:测试⽂件是否可读
山海经之山河图
W_OK:测试⽂件是否可写
X_OK:测试⽂件是否可执⾏
(4)返回值
成功:0
失败:-1
函数描述:为进程设置⽂件模式创建屏蔽字,并返回之前的值(1)头⽂件: #include <sys/stat.h>
(2)函数原型: mode_t umask(mode_t cmask);(3)参数:
cmask:(下⾯9个常量中的若⼲个按位或构成),例如:S_IRUSR|S_IRGRP //权限就为⽤户读和组读
好专业st_mode 屏蔽                    含义            S_IRUSR                      ⽤户读            S_IWUSR                      ⽤户写            S_IXUSR                      ⽤户执⾏
这是access 函数的具体⽤法的代码(argv[1]
必须是⼀个已经存在的⽂件):
#include <stdio.h>#include <unistd.h>#include <stdlib.h>
int  main(int  argc,char  **argv){
if (argc != 2)    {
printf("argc must equal to two!\n");        exit(1);    }
if (access(argv[1],F_OK)) //判断⽂件是否存在    {
printf("%s  not existence!\n",argv[1]);        exit(1);    }
if (access(argv[1],R_OK)) //判断⽂件是否可读    {
printf("%s not read permission\n",argv[1]);    }    else    {
printf("%s  have read permission\n",argv[1]);    }
if (access(argv[1],W_OK))  //判断⽂件是否可写    {
printf("%s not write permission\n",argv[1]);    }        else    {
printf("%s  have write permission\n",argv[1]);  }
if (access(argv[1],X_OK)) //判断⽂件是否可执⾏    {
printf("%s not execute permission\n",argv[1]);    }    else    {
printf("%s have execute permission\n",argv[1]);    }    return  0;}
View Code  在ubuntu
下运⾏:
当然了既然有权限,那么我们在创建⽂件的时候⽂件权限也是可以⾃⼰控制的,umask 函数⽤上场了
S_IRGRP                        组读
S_IWGRP                        组写
S_IXGRP                        组执⾏
S_IROTH                      其他读
S_IWOTH                      其他写
S_ICOTH                      其他执⾏
(4)返回值:
成功:之前的⽂件模式创建屏蔽字
代码的具体⽤法如下:
#include <sys/stat.h>
#include <stdio.h>
#include <sys/types.h>
#include <fcntl.h>
#include <stdlib.h>
#define RRR (S_IRUSR|S_IRGRP|S_IROTH) //设置⽂件权限为⽤户读、组读、其他读
int main(int argc,char *argv[])
{
umask(0); //不设置⽂件屏蔽字
creat("text",RRR); //以⽤户读、组读、其他读的权限创建⽂件 //这⾥也可以⽤open抗原试剂盒价格战:单价降至个位数
umask(S_IRUSR|S_IRGRP); //创建⽤户读、组出屏蔽字
creat("text1",RRR);  //最后创建出来的⽂件只有其他读的权限
return0;
}
View Code
既然⽂件可以创建,当然⽬录也是可以创建的,mkdir函数就是为创建⽬录⽽⽣的:
函数描述:创建⼀个空⽬录,.和..⾃动创建
(1)头⽂件
#include <sys/stat.h>
(2)函数原型
int mkdir(const char *path, mode_t mode);
(3)参数:
a、path:⽂件名
b、mode:是以下15种常量的按位或
mode                    含义
S_ISUID              执⾏时设置⽤户ID
S_ISGID              执⾏时设置组ID
S_ISVTX              保存正⽂(粘着位)
S_IRWXU            ⽤户(所有者)、读、写和执⾏
S_IRUSR              ⽤户(所有者)读
S_IWUSR            ⽤户(所有者)写
S_IXUSR              ⽤户(所有者)执⾏
S_IRWXG            组读、写和执⾏
S_IRGRP              组写
S_IWGRP            组读
S_IXGRP              组执⾏
S_IRWXO            其他读、写和执⾏
S_IROTH            其他读
S_IWOTH            其他写
S_IXOTH            其他执⾏
(4)返回值
成功:0
失败:-1
创建⽬录的具体实现:
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
int main(int argc,char *argv[])
{
if(mkdir("",S_IWOTH|S_IRUSR|S_IRGRP) == -1) /*以其他写、⽤户读、组读权限创建⼀个空⽬录*/
{
perror("mkdir");
exit(1);
}
return0;
}
View Code
umask函数是在创建⽂时设置权限,那么在⽂件被创建之后还能修改权限吗?这时候chmod函数就派上⽤处了(1)头⽂件        #include <sys/stat.h>
(2)函数原型    int chmod(const char *path, mode_t mode);
(3)参数:
a、path:⽂件路径
b、mode:跟上⾯midir函数中的成员mode⼀样,其中的宏位或就可以了
改变⽂件权限的例⼦:
chmod("text",S_IRUSR|S_IRGRP|S_IROTH);    //把text⽂件的权限改为⽤户读、组读、其他读
既然权限可以改变权限,当然改个名字也是没问题的,⽤rename函数轻松解决问题:
(1)头⽂件#include <stdio.h>
(2)函数原型  int rename(const char *old, const char *new);
(3)参数:
a、old:⽂件原来的名字
b、new:新的名字
(4)返回值:
成功:0
失败:-1
改变⽂件名字的例⼦:
rename("text","hhtext"); //将名字为text的⽂件改为hhtext
其实⽂件中还有个⼩操作就是可以在任何位置截断⽂件中的内容:
truncate("test",3);    //将⽂件test长度截断为3字节
好了讲了那么多关于⽂件的权限的东西,是时候讲讲怎么打开⼀个⽬录和读⽬录中的的东西了:
读⽬录中,要经过三步:打开⽬录、读⽬录、关闭⽬录,对应⽤到的函数分别为opendir、readdir、closedir。
⼀、打开⽬录
(1)头⽂件
#include <sys/types.h>
#include <dirent.h>
(2)函数原型
DIR *opendir(const char *name);
(3)参数
name:⽬录名
(4)返回值:
成功:返回⼀个DIR*型的⽬录流
失败:NULL
⼆、读⽬录
(1)头⽂件
#include <dirent.h>
(2)函数原型
struct dirent *readdir(DIR *dirp);
(3)参数
a、dirp:调⽤opendir函数后返回的DIR*类型的⽬录流
(4)返回值:
成功:返回⼀个(struct dirent)型的结构体
下⾯是struct dirent结构体的具体内容
struct dirent {
ino_t          d_ino;      节点号  /*inode number */
off_t          d_off;      偏移到下⼀个⽅向 /* offset to the next dirent */
简洁网名吧
unsigned short d_reclen;    记录长度 /* length of this record */
unsigned char  d_type;      ⽂件类型,不⽀持所有⽂件系统类型/* type of file; not supportedby all file system types */ char          d_name[256]; ⽂件名 /* filename */
};
struct dirent中的成员d_type⼜有以下⼏种类型:
DT_BLK    块设备(This is a block device.)
DT_CHR    字符设备(This is a character device.)
DT_DIR    ⽬录( This is a directory.)
DT_FIFO    命名管道或FIFO(This is a named pipe (FIFO).)
DT_LNK    符号连接(This is a symbolic link.)
DT_REG    普通⽂件(This is a regular file.)公务员考试费用
DT_SOCK    UNIX域套接字( This is a UNIX domain socket.)
DT_UNKNOWN  未知类型(The file type is unknown.)
读完或者失败都返回NULL
三、关闭⽬录
(1)头⽂件
#include <sys/types.h>
#include <dirent.h>
(2)函数原型
int closedir(DIR *dirp);
(3)参数
a、dirp:⽤opendir函数后返回的DIR*类型的⽬录流
(4)返回值:
成功:0
失败:-1
四、更改当前⼯作路径
(1)头⽂件    #include <unistd.h>
(2)函数原型  int chdir(const char *path);
(3)参数:
a、path:需要更改的路径
(4)返回值
成功:0
失败:-1
例⼦:
chdir("/"); //当前⼯作⽬录更改到中
五、获得当前⼯作⽬录完整的绝对路径
(1)头⽂件    #include <unistd.h>
(2)函数原型char *getcwd(char *buf, size_t size);
(3)参数:
a、buf:存放绝对路径的缓冲区
b、size: 缓冲区的⼤⼩
(4)返回值:
成功:返回当前⼯作⽬录完整的绝对路径

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。