Linux系统对文件有极其严格的保护。如果用户不具备访问某个文件或目录的权限,那么就不能对文件进行操作。文件的属性和权限是Linux中目录和文件的两个基本特性。
查看文件的属性
在Linux中可以通过:ls -l 查看文件或目录的属性,输出中每行文件信息的第一组字符串就是文件的权限信息。
ls -l以长格式显示目录下的内容列表,从左到右以此为:
- 文件的权限标志
- 文件的链接个数
- 文件所有者的用户名
- 该用户所造的用户组的组名
- 文件的大小
- 最后一次被修改的时间
- 文件名
其中:字符串的首字母是用来表示该文件的类型。
d:表示目录;
-:表示普通文件
b:表示输入输出设备文件,通常是磁盘驱动器;
c:表示连续输入输出设备,通常是声卡、调制解调器等;
l:表示是链接文件
p:表示是管道文件
文件的权限
文件的权限可简单概括如下:
用户 组 其它
rwx rwx rwx
普通文件:
r 可读权限
w 可写权限
可执行权限
目录
r 是否可浏览
w 是否可创建或删除
x 是否可进入
文件的权限分别为属主(user),属组(group),和其他用户(other)的权限:
比如:drwxrwxr-x
这10个字符应该这样断开:
d rwx rwx r-x 分别表示文件类型,属主、属组、和其他人所拥有的权限。如果某个权限被禁用,那么就用一个”-“代替。如这个例子中其他用户的权限为r-x,表示其他用户对其有可读,可执行权限,无可写权限。
打开文件、新建文件和关闭文件操作
打开文件、新建文件和关闭文件是最基本的3个操作。
打开文件操作使用系统调用函数open(),该函数的作用是建立一个文件描述符,其他的函数可以通过文件描述符对指定文进行读取和写入操作。
打开文件的一般形式是:open(文件路径,标志);
函数的返回值是文件描述符,如果打开文件成功,返回一个正整数,否则,返回-1;
标志是用于指定打开文件操作模式的枚举常量。可以以只读、只写、读和写方式打开文件。打开文件的主标志如下表:
参数 | 说明 |
---|---|
O_RDONLY | 以只读方式打开文件 |
O_WRONLY | 以只写方式打开文件 |
O_RDWR | 以可读可写方式打开文件 |
主标志是互斥的,只能使用其中一种。副标志可以与主标志配合使用,即可同时使用多个副标志,使用时在主标志与副标志之间加入按位与“|”运算符。
打开文件操作的副标志:
参数 | 说 明 |
---|---|
O_APPEND | 读写文件从文件尾部开始移动,所写入的数据追加到文件尾 |
O_TRUNC | 若文件存在并且以可写的方式打开,此标志会将文件长度清0,而原来存在于该文件的数据将会消失 |
O_CREAT | 若路径中的文件不存在则自动建立该文件 |
O_EXCL | 如果与O_CREAT同时设置,此指令会去检查文件是否存在,如文件不存在则建立该文件,否则将导致打开文件错误。如果O_CREAT与O_EXCL同时设置,并且将要打开的文件为符号连接,否则将导致打开文件失败。 |
O_CREAT是使用相对较多的副标志,O_CREAT用于打开的文件不存在时新建文件:是在打开文件的操作的函数上加入O_CREAT副标志来实现的。当路径中的文件不存在时,则创建一个新文件。创建新文件的同时可以设置文件的权限,这是函数需要增加一组实际参数。形式为:
open(文件路径,标志,权限标志);
文件的权限标志可以使用加权数字表示,这组数字称为 umask 变量,(一个无符号8进制数)。用户获得的权限是加权数字的总和。umask变量由3位数字组成,数字的每一位代表一类权限(依次为读、写、执行权限)。权限的加权数是将权限分别用数值4、2、1表示。这样rwx就可以转化为7,rw转化为6、rx转化为5,r转化为4。
新建文件的另一个函数是 creat();该函数的一般形式为:
creat(路径,权限掩码);
当文件被成功创建函数的返回值为0,否则为-1。
关闭文件使用close()函数,函数一般形式为close(文件描述符);
如果关闭文件成功,函数返回值为0,否则返回-1。
下面是使用C语言代码实现简单的文件操作:
1 #include<stdio.h>
2 #include<unistd.h>
3 #include<fcntl.h>
4 #include<sys/types.h>
5 #include<sys/stat.h>
6
7 int main()
8 {
9 int fd; //文件标识符
10 char *path = "./test.txt"; //定义路径字符串,./表示当前路径,也可以自己指定路径,./可以省略,默认为为当前路径
11 fd = open(path,O_RDONLY); //以只读方式打开文件
12 //open函数用于打开文件,如果打开文件成功返回一个正整数,否则返回-1
13 if(fd < 0) //打开文件失败
14 {
15 printf("打开文件失败!\n");
16 fd = open(path,O_RDONLY|O_CREAT,0741); //创建文件
17 if(fd!=-1)
18 {
19 printf("创建了一个新文件!\n");
20 }
21 else
22 {
23 printf("创建文件失败!\n");
24
25 }
26
27 }
28 else
29 {
30 printf("打开文件成功!\n");
31 }
32 close(fd);
33
34 return 0;
35 }
该程序首先判断是否存在文件test.txt,判断方法是使用open函数打开test.txt文件,如果返回值小于使用0,则输出提示信息,打开文件失败,当文件不存在时使用open创建一个名为test.txt的新文件,使用GCC进行编译,运行结果输出:打开文件失败,创建了一个新文件。这时我们使用ls命令,可以看到当前目录下多出一个test.txt的文件。这时test.txt文件已经存在,再次运行程序则会输出:打开文件成功!。