一、问题描述

fopen函数使用过程发现,当fopen要打开的文件路径中,包含一个不存在路径时,不管fopen函数的第二参数设成什么,都无法建立该文件。实例:char *filename = "/usr/local/ct/mirror_im_protocol.cfg";FILE *fp = NULL; if ((fp=fopen(filename,"a"))==NULL){    printf("open file %s error\n",filename);    return FAIL; }

上述实例中,若/usr/local/ct/不存在,fopen将不会建立mirror_im_protocol.cfg文件,导致fopen返回NULL。当/usr/local/ct/路径存在,而mirror_im_protocol.cfg不存在时,函数会自动创建该文件,并往文件中追加内容。

因此,在使用fopen函数创建一个新文件时,一定要保证文件的路径存在,可以考虑在fopen函数前加一个路径检查。

二、路径检查

access函数可以用来判断文件夹或者文件是否存在。

函数原型: int access(const char *filename, int mode);

所属头文件:io.h

filename:可以填写文件夹路径或者文件路径

mode:0 (F_OK) 只判断是否存在

2 (R_OK) 判断写入权限

4 (W_OK) 判断读取权限

6 (X_OK) 判断执行权限

用于判断文件夹是否存在的时候,mode取0,判断文件是否存在的时候,mode可以取0、2、4、6。 若存在或者具有权限,返回值为0;不存在或者无权限,返回值为-1。

错误代码

EACCESS 参数pathname 所指定的文件不符合所要求测试的权限。

EROFS 欲测试写入权限的文件存在于只读文件系统内。

EFAULT 参数pathname指针超出可存取内存空间。

EINVAL 参数mode 不正确。

ENAMETOOLONG 参数pathname太长。

ENOTDIR 参数pathname为一目录。

ENOMEM 核心内存不足

ELOOP 参数pathname有过多符号连接问题。

EIO I/O 存取错误。

特别提醒:使用access()作用户认证方面的判断要特别小心,例如在access()后再做open()的空文件可能会造成系统安全上的问题。

实例:

#include #include #define  AUDI_PROCESS_PID_PATH  " /usr/local/ct/" int main(void) {     if ( access(AUDI_PROCESS_PID_PATH, F_OK) == 0) )          printf("AUDI_PROCESS_PID_PATH EXISITS!");     else          printf("AUDI_PROCESS_PID_PATH DOESN'T EXISIT!");     return 0; }       当检查到路径不存在时,可通过下面的函数来进行路径的创建。三、创建目录原型:int mkdir (const char *filename, mode_t mode)

返回0表示成功,返回-1表述出错。

使用该函数需要包含头文件sys/stat.h

mode 表示新目录的权限,可以取以下值:

S_IRUSR

S_IREAD

Read permission bit for the owner of the file. On many systems thisbit is 0400. S_IREAD is an obsolete synonym provided for BSDcompatibility.

//这是对文件用户的读权限赋予

S_IWUSR

S_IWRITE

Write permission bit for the owner of the file. Usually 0200.S_IWRITE is an obsolete synonym provided for BSDcompatibility.

//这是对文件用户的写权限赋予

S_IXUSR

S_IEXEC

Execute (for ordinary files) or search (for directories) permissionbit for the owner of the file. Usually 0100. S_IEXEC is an obsoletesynonym provided for BSD compatibility.

//这是对文件用户执行权限赋予

S_IRWXU

This is equivalent to (S_IRUSR | S_IWUSR | S_IXUSR).

//这包含了以上三种用户权限

S_IRGRP

Read permission bit for the group owner of the file. Usually040.

//这是对文件用户组读权限赋予

S_IWGRP

Write permission bit for the group owner of the file. Usually020.

//这是对文件用户组写权限赋予

S_IXGRP

Execute or search permission bit for the group owner of the file.Usually 010.

//这是对文件用户组执行权限赋予

S_IRWXG

This is equivalent to (S_IRGRP | S_IWGRP | S_IXGRP).

//这包含了以上三种组用户权限

S_IROTH

Read permission bit for other users. Usually 04.

//对其他用户的读操作赋予

S_IWOTH

Write permission bit for other users. Usually 02.

//对其他用户的写操作赋予

S_IXOTH

Execute or search permission bit for other users. Usually 01.

//对其他用户的执行操作赋予

S_IRWXO

This is equivalent to (S_IROTH | S_IWOTH | S_IXOTH).

//这包含了以上三种组其他用户权限赋予

S_ISUID

This is the set-user-ID on execute bit, usually 04000. See HowChange Persona.

//这下面就不说明了,因为这又涉及set uid ,set gid,stickybit这三个权限,后面有一篇转贴再说明,不过这也只有我这样的菜鸟不知道的啦.

S_ISGID

This is the set-group-ID on execute bit, usually 02000. See HowChange Persona.

S_ISVTX实例:#include #include   int main(){    int status;     status = mkdir("/home/newdir", S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);      return 0;}这样就创建了一个newdir目录,权限通过ls -al 查看为

drwxr-xr-x 跟用linux命令mkdir创建的目录权限位一致。

四、fopen函数

函数原型:FILE * fopen(const char * path,const char * mode);

返回值:文件顺利打开后,指向该流的文件指针就会被返回。如果文件打开失败则返回NULL,并把错误代码存在errno中。

一般而言,打开文件后会做一些文件读取或写入的动作,若打开文件失败,接下来的读写动作也无法顺利进行,所以一般在fopen()后作错误判断及处理。

参数说明:

参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态。

mode有下列几种形态字符串:

“r” 以只读方式打开文件,该文件必须存在。

“r+” 以可读写方式打开文件,该文件必须存在。

”rb+“ 读写打开一个二进制文件,允许读写数据,文件必须存在。

“w” 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。

“w+” 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。

“a” 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)

”a+“ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 (原来的EOF符不保留)

“wb” 只写打开或新建一个二进制文件;只允许写数据。

“wb+” 读写打开或建立一个二进制文件,允许读和写

“wx” 创建文本文件,只允许写入数据.[C11]

“wbx” 创建一个二进制文件,只允许写入数据.[C11]

”w+x“ 创建一个文本文件,允许读写.[C11]

“wb+x” 创建一个二进制文件,允许读写.[C11]

“w+bx” 和"wb+x"相同[C11]

————————————————

原文链接:https://blog.csdn.net/u013485792/article/details/52327718

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

linux fopen文件失败,fopen自动创建文件失败(文件路径检查创建)相关推荐

  1. linux自动挂载文件修复,Linux文件系统管理 开机自动挂载及fstab文件修复

    概述 开机自动挂载及fstab文件修复 开机自动挂载 实现开机后自动挂载,就需要修改系统的自动挂载文件 /etc/fstab.因为系统就是依赖这个文件决定启动时加载的文件系统的. 通过vi 打开/et ...

  2. 自动拷贝文件至服务器,自动拷贝远程服务器文件

    自动拷贝远程服务器文件 内容精选 换一换 本章节介绍Dubbo框架下MQ消息接入DTM事务的demo,使得Dubbo框架下的MQ消息项目可以快速接入DTM.其中,Dubbo的样例代码在 导入样例工程 ...

  3. matlab 循环写excel文件,matlab数据自动循环写入excel文件

    功能说明: 1.表格第一行(1)要留着添加表头描述,同时也可以随时向表格手工添加数据,因此不能用计数进行循环 第一列(A)为时间戳字符串(如20150413123415).每次运行程序就存储一次数据, ...

  4. 计算机无法自动排列,Win10电脑如何设置文件夹不再自动排列|取消电脑文件夹自动排列的方法...

    往往在ghost win10 64位系统上的文件夹都会自动进行排列,这个设置都是系统默认的,可以让文件夹有序的摆放好,对查找有些帮助.但是有些用户表示,想取消Win10电脑的文件夹自动排列设置,让我教 ...

  5. python模块下载失败_pycharm自动安装模块失败了怎么办

    pycharm自动安装模块失败了的解决方法:1.执行[pip -V]命令查看是否安装了pip:2.如果没有安装pip,则执行[python get-pip.py]命令进行安装:3.执行[pip ins ...

  6. linux新建备份数据库的脚本文件,Linux下shell脚本:自动每日备份网站文件和数据库上传FTP空间...

    前言 服务器.vps,难免会遇到各种问题,丢失数据,则必然痛心疾首啊!!! 数据无价,so建议养成定期备份的习惯!而且,要多备份几份,本地.网盘.FTP空间等,都多保存几份! 这里,就为大家带来一个l ...

  7. 上上签文件手动签自动签盖章失败问题

    前言 调用上上签SDK,发起文件合同手动签,盖章后失败,无印章,自动签后,依然无印章,下载合同预览长这样,可以看出实际上改了章,但是就是没有矢量图电子签章 原因 一个非常细微的问题,文件设置了禁止签名 ...

  8. 监听文件修改,自动加载xml文件。

    转载文章,转载自,公司项目,董亚杰写的. 下面是完整的代码,复制的. package cn.digitalpublishing.util.debug;import java.io.File; impo ...

  9. 关于VBS 文件执行后自动删除执行的文件

    Dim fso Set fso =CreateObject("Scripting.FileSystemObject") fso.DeleteFile WScript.ScriptF ...

  10. linux环境编程vimrc,vim设置/etc/vim/vimrc文件

    Linux下vim编辑器(.vimrc文件) 在终端下使用vim进行编辑时,默认情况下,编辑的界面上是没有显示行号.语法高亮度显示.智能缩进等功能的.为了更好的在vim下进行工作,需要手动设置一个配置 ...

最新文章

  1. 【观点】开发人员的测试悖论
  2. PHP-代码审计-文件删除
  3. 【转】C# Stream篇(—) -- Stream基类
  4. Java基础夺命连环16问
  5. 转 :原码,反码,补码
  6. Kali Linux 网络扫描秘籍 第三章 端口扫描(一)
  7. android service 构造函数,Android IntentService无法实例化类;没有空构造函数
  8. Webrct之demo运行
  9. js随机获取数组中的值
  10. Command(命令)
  11. js双等号探索(三): [] == false为True,而!![] == false为False ?
  12. 2014年上半年系统集成项目管理工程师真题解析(上午+下午)
  13. 服务器系统瘦身,数据瘦身服务
  14. B站的经典封面制作方法
  15. 03_美国医疗保健行业的数据介绍
  16. 微信消息记录如何恢复
  17. 你应该具有的富人思维
  18. 利用批处理代码快速恢复桌面图标小箭头,更可能解决win7出现黑色方块问题
  19. 转载 冯羽的程序生涯之我见
  20. 淘宝天猫店招空白间隔去除

热门文章

  1. Kafka负载均衡、Kafka自定义Partition、Kafk文件存储机制
  2. 项目经理案头手册学习系列【18】——社会技术系统和项目组织
  3. 《矩阵分析》Ⅳ——三对角矩阵的追赶法matlab实现
  4. 洛谷 P1595 信封问题
  5. mvc actionresult返回各种文件
  6. 系统架构升级建议书(1)
  7. 网吧网络综合问题讨论和解决方案
  8. CMD下的网络安全配置
  9. [置顶] C#中给Label控件设置BackgroundImage属性
  10. AtCoder Regular Contest 102 (ARC102) E - Stop. Otherwise... 排列组合