linux fopen文件失败,fopen自动创建文件失败(文件路径检查创建)
一、问题描述
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自动创建文件失败(文件路径检查创建)相关推荐
- linux自动挂载文件修复,Linux文件系统管理 开机自动挂载及fstab文件修复
概述 开机自动挂载及fstab文件修复 开机自动挂载 实现开机后自动挂载,就需要修改系统的自动挂载文件 /etc/fstab.因为系统就是依赖这个文件决定启动时加载的文件系统的. 通过vi 打开/et ...
- 自动拷贝文件至服务器,自动拷贝远程服务器文件
自动拷贝远程服务器文件 内容精选 换一换 本章节介绍Dubbo框架下MQ消息接入DTM事务的demo,使得Dubbo框架下的MQ消息项目可以快速接入DTM.其中,Dubbo的样例代码在 导入样例工程 ...
- matlab 循环写excel文件,matlab数据自动循环写入excel文件
功能说明: 1.表格第一行(1)要留着添加表头描述,同时也可以随时向表格手工添加数据,因此不能用计数进行循环 第一列(A)为时间戳字符串(如20150413123415).每次运行程序就存储一次数据, ...
- 计算机无法自动排列,Win10电脑如何设置文件夹不再自动排列|取消电脑文件夹自动排列的方法...
往往在ghost win10 64位系统上的文件夹都会自动进行排列,这个设置都是系统默认的,可以让文件夹有序的摆放好,对查找有些帮助.但是有些用户表示,想取消Win10电脑的文件夹自动排列设置,让我教 ...
- python模块下载失败_pycharm自动安装模块失败了怎么办
pycharm自动安装模块失败了的解决方法:1.执行[pip -V]命令查看是否安装了pip:2.如果没有安装pip,则执行[python get-pip.py]命令进行安装:3.执行[pip ins ...
- linux新建备份数据库的脚本文件,Linux下shell脚本:自动每日备份网站文件和数据库上传FTP空间...
前言 服务器.vps,难免会遇到各种问题,丢失数据,则必然痛心疾首啊!!! 数据无价,so建议养成定期备份的习惯!而且,要多备份几份,本地.网盘.FTP空间等,都多保存几份! 这里,就为大家带来一个l ...
- 上上签文件手动签自动签盖章失败问题
前言 调用上上签SDK,发起文件合同手动签,盖章后失败,无印章,自动签后,依然无印章,下载合同预览长这样,可以看出实际上改了章,但是就是没有矢量图电子签章 原因 一个非常细微的问题,文件设置了禁止签名 ...
- 监听文件修改,自动加载xml文件。
转载文章,转载自,公司项目,董亚杰写的. 下面是完整的代码,复制的. package cn.digitalpublishing.util.debug;import java.io.File; impo ...
- 关于VBS 文件执行后自动删除执行的文件
Dim fso Set fso =CreateObject("Scripting.FileSystemObject") fso.DeleteFile WScript.ScriptF ...
- linux环境编程vimrc,vim设置/etc/vim/vimrc文件
Linux下vim编辑器(.vimrc文件) 在终端下使用vim进行编辑时,默认情况下,编辑的界面上是没有显示行号.语法高亮度显示.智能缩进等功能的.为了更好的在vim下进行工作,需要手动设置一个配置 ...
最新文章
- 【观点】开发人员的测试悖论
- PHP-代码审计-文件删除
- 【转】C# Stream篇(—) -- Stream基类
- Java基础夺命连环16问
- 转 :原码,反码,补码
- Kali Linux 网络扫描秘籍 第三章 端口扫描(一)
- android service 构造函数,Android IntentService无法实例化类;没有空构造函数
- Webrct之demo运行
- js随机获取数组中的值
- Command(命令)
- js双等号探索(三): [] == false为True,而!![] == false为False ?
- 2014年上半年系统集成项目管理工程师真题解析(上午+下午)
- 服务器系统瘦身,数据瘦身服务
- B站的经典封面制作方法
- 03_美国医疗保健行业的数据介绍
- 微信消息记录如何恢复
- 你应该具有的富人思维
- 利用批处理代码快速恢复桌面图标小箭头,更可能解决win7出现黑色方块问题
- 转载 冯羽的程序生涯之我见
- 淘宝天猫店招空白间隔去除
热门文章
- Kafka负载均衡、Kafka自定义Partition、Kafk文件存储机制
- 项目经理案头手册学习系列【18】——社会技术系统和项目组织
- 《矩阵分析》Ⅳ——三对角矩阵的追赶法matlab实现
- 洛谷 P1595 信封问题
- mvc actionresult返回各种文件
- 系统架构升级建议书(1)
- 网吧网络综合问题讨论和解决方案
- CMD下的网络安全配置
- [置顶] C#中给Label控件设置BackgroundImage属性
- AtCoder Regular Contest 102 (ARC102) E - Stop. Otherwise... 排列组合