打开文件、新建文件和关闭文件操作

打开文件操作使用系统调用函数open(),该函数的作用是建立一个文件描述符,其他的函数可以通过文件描述符对指定文件进行读取与写入的操作。打开文件的一般形式是:

  1. open(文件路径, 标志); 

函数的返回值是文件描述符,如果打开文件成功返回一个正整数,否则返回-1。标志是用于指定打开文件操作模式的枚举常量,主标志如表13.1所示。

表13.1  打开文件操作的主标志

参    数

说    明

参    数

说    明

O_RDONLY

以只读方式打开文件

O_RDWR

以可读写方式打开文件

O_WRONLY

以只写方式打开文件

 

 


主标志是互斥的,使用其中一种则不能再使用另外一种。除了主标志以外,还有副标志可与它们配合使用,副标志可同时使用多个,使用时在主标志和副标志之间加入按位与(|)运算符,如表13.2所示。

表13.2  打开文件操作的副标志

参    数

说    明

O_APPEND

读写文件从文件尾部开始移动,所写入

的数据追加到文件尾

O_TRUNC

若文件存在并且以可写的方式打开时,

此标志会将文件长度清为0,而原来存于

该文件的资料也会消失

O_CREAT

若路径中的文件不存在则自动建立该文件

O_EXCL

如果与O_CREAT同时设置,此指令会去检

查文件是否存在,文件若不存在则建立该文

件,否则将导致打开文件错误。此外,若

O_CREAT与O_EXCL同时设置,并且将要

打开的文件为符号连接,则将导致打开文件失败


新建文件操作是在打开文件操作的函数上加入O_CREAT副标志实现的。当路径中的文件不存在时,则创建一个新文件。创建新文件的同时可设置文件的权限,这时函数需要增加一组实际参数,形式为:

  1. open(文件路径, 标志, 权限标志); 

文件权限标志如表13.3所示。

表13.3  文件权限标志

参    数

说    明

参    数

说    明

S_IRUSR

所有者拥有

读权限

S_IXGRP

群组拥有执

行权限

S_IWUSR

所有者拥有

写权限

S_IROTH

其他用户拥

有读权限

S_IXUSR

所有者拥有

执行权限

S_IWOTH

其他用户拥

有写权限

S_IRGRP

群组拥有读权限

S_IXOTH

其他用户拥

有执行权限

S_IWGRP

群组拥有写权限

 

 


文件权限标志也可以使用加权数字表示,这组数字被称为umask变量,它的类型是mode_t,是一个无符号八进制数。umask变量的定义方法如表13.4所示。umask变量由3位数字组成,数字的每一位代表一类权限。用户所获得的权限是加权数值的总和。例如764表示所有者拥有读、写和执行权限,群组拥有读和写权限,其他用户拥有读权限。

表13.4  umask变量表示方法

加 权 数 值

第1位

第2位

第3位

4

所有者拥有

读权限

群组拥有读权限

其他用户拥

有读权限

2

所有者拥有

写权限

群组拥有写权限

其他用户拥

有写权限

1

所有者拥有

执行权限

群组拥有执行权限

其他用户拥

有执行权限

新建文件的另一个函数是creat(),该函数的一般形式是:

  1. creat(路径, umask); 

当文件被成功创建函数的返回值为0,否则为-1。当文件不需要使用了,则可以使用close()函数关闭文件。关闭文件的一般形式为:close(文件描述符),如果关闭文件成功,close()函数的返回0,否则返回-1。

下例将演示打开文件、新建文件和关闭文件这3种操作。程序的逻辑为:指定一个路径,如果该文件存在,输出提示信息,关闭该文件;如果该文件不存在,则新建文件并设置文件属性,输出提示信息,然后关闭该文件。完整的代码如下:

#include <fcntl.h>                          // 提供open()函数
#include <sys/types.h>                      // 提供mode_t类型
#include <sys/stat.h>                       // 提供open()函数的符号
#include <unistd.h>                         // 提供close()函数
#include <stdio.h>
int main()
{  int f;                                   // 声明变量f,
用于保存文件标识符  const char *f_path = "test";             // 定义路径字符串  mode_t f_attrib;                         // 声明mode_t
型变量,保存文件属性  f_attrib = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH;  // 为umask变量赋值  f = open(f_path, O_RDONLY);              // 以只读方式打开文件  if (f == -1) {                           // 判断文件是否打开成功  f =open(f_path, O_RDWR | O_CREAT, f_attrib);  // 创建新文件  if (f != -1)                                  //
判断文件创建是否成功  puts("创建一个新文件");  else {  puts("无法创建新文件,程序退出");  return 1;  }  }  else  puts("文件打开成功");  close(f);                                            // 关闭文件  return 0;
} 

该程序首先判断是否存在文件test,判断的方法是用open()函数打开test文件,如果返回值是-1,则表示该文件不存在(有时候并非如此)。当文件不存在时,使用open()函数创建该文件,并在程序最后关闭。为mode_t型变量f_attrib赋值的方法使用了按位计算操作,将表示文件权限的常量进行按位或计算,计算的结果与八进制数0664相同,如图13.3所示。

 

                                                               


注:这篇文章来自博客园一博主的贡献,感谢博主的分享

UNIX文件mode_t详解相关推荐

  1. C 和 C++ 文件操作详解

    来源:http://www.cnblogs.com/likebeta/archive/2012/06/16/2551662.html 来源:http://www.cnblogs.com/likebet ...

  2. UNIX经典命令详解

    UNIX经典命令详解 第一章 目录及文件操作命令 1.1 ls [语法]: ls [-RadCxmlnogrtucpFbqisf1] [目录或文件......]  [说明]: ls 命令列出指定目录下 ...

  3. 制作CYDIA发布源的DEB文件,详解!

    原文地址:制作CYDIA发布源的DEB文件,详解!作者:NeoZ 首先需要一个可以编辑和压制的环境,Ubuntu/Debian 是 deb 文件系统的原生系统,在兼容性和处理性能上最好. 如果你没有L ...

  4. Qt QFile文件操作详解

    Qt QFile文件操作详解 很多应用程序都需要具备操作文件的能力,包括对文件内容进行读/写.创建和删除文件等,甚至某些应用程序的诞生纯粹是为了操作文件,比如 WPS Office.PDFedit 等 ...

  5. 基于php下载文件的详解

    基于php下载文件的详解 本篇文章是对php下载文件进行了详细的分析介绍,需要的朋友参考下 php下载文件,比如txt文件. 出现的效果就是,弹出浏览器自带的下载框,出现另存为操作.有时候会出现内存溢 ...

  6. linux文件权限详解

    linux文件权限详解 一.文件和目录权限概述 在linux中的每一个文件或目录都包含有访问权限,这些访问权限决定了谁能访问和如何访问这些文件和目录. 通过设定权限可以从以下三种访问方式限制访问权限: ...

  7. VMware虚拟机文件夹中各文件作用详解

    VMware虚拟机文件夹中各文件作用详解 虚拟机的文件管理由VMware Workstation来执行. 一个虚拟机一般以一系列文件的形式储存在宿主机中, 这些文件一般在由workstation为虚拟 ...

  8. 每天一个linux命令(2):文件权限详解

    Linux文件权限详解 文件和目录权限概述 在linux中的每一个文件或目录都包含有访问权限,这些访问权限决定了谁能访问和如何访问这些文件和目录. 通过设定权限可以从以下三种访问方式限制访问权限:只允 ...

  9. java读取本地文件_java 读取本地文件实例详解

    java 读取本地文件实例详解 用javax.xml.w3c解析 实例代码: package cn.com.xinli.monitor.utils; import org.w3c.dom.Docume ...

最新文章

  1. 第二期安全狗讲坛3月11日开始
  2. 对讲机的那点事:带你玩转LD800数字车载台读、写频操作:一
  3. 用 Redis 处理 jsonwebtoken 生成的 Token
  4. 用例子来彻底搞明白Virtual 和 非 virtual(C#)
  5. jquery.form 和MVC4做无刷新上传DEMO
  6. react native 的赋值比较,空字符串以及undefined
  7. Natasha 4.0 探索之路系列(三) 基本的动态编译
  8. 使用try-with-resources替代try finally释放资源
  9. 数仓出现“wait in ccn queue”的时候,怎么迅速定位处理?
  10. flex布局怎么设置子元素大小_48张小图带你领略Flex 布局之美
  11. python字符串(string)方法整理
  12. VMware虚拟机找不到USB设备该怎么办?
  13. 在VS2010中使用Git管理源代码
  14. 论文排版 | Texworks
  15. 史上最全的前端资源汇总(上)
  16. 开发者的固化思维及解决办法
  17. yolov4用1050ti_Windows下基于VS2019|Opencv4.2.0|CUDA10.0|YOLOv4
  18. php图形验证码验证,php图片验证码代码
  19. 嵌入式--LCD常用接口介绍
  20. css div自适应高度height

热门文章

  1. Simplivity存储家族推新:满足所有闪存需求和更好的灾难恢复
  2. 《软件工程方法与实践》—— 导读
  3. jQuery UI 拖动(Draggable) - 延迟开始
  4. 设计模式 -- 中介者设计模式 (Mediator Pattern)
  5. Elixir 1.3带来新的语言功能、API和改进后的工具
  6. Material Design(十一)--CoordinatorLayout和自定义视图
  7. 企业架构研究总结(2)——问题的由来和基本概念
  8. 收集Oracle常用命令----索引及约束
  9. 让IE8和IE9支持 placeholder
  10. 浅析机器视觉在安防行业的应用