C++做项目的过程中,需要实现文件打开保存的一个功能,当我对文件tmp.dat进行写操作以后,想要第二次对此文件进行写操作,此时用fopen_s,_wfopen_s均出现返回int error = 13也就是EACCES (Permission denied)的错误。
而由于项目是Unicode编码,没办法用fopen进行文件操作(其实只要在预编译中加入_CRT_SECURE_NO_WARNINGS,用fopen是可以的,并且可以进行共享读写,但是我不想这样做)。于是各种搜索,以及查阅MSDN。MSDN上是这么说的:
Files opened by fopen_s and _wfopen_s are not sharable. If you require that a file be sharable, use _fsopen, _wfsopen with the appropriate sharing mode constant (for example, _SH_DENYNO for read/write sharing).
链接:https://msdn.microsoft.com/zh-cn/library/z5hh6ee9(v=vs.90).aspx
就是说,fopen_s 和 _wfopen_s不支持文件共享,当你用fopen_s 或 _wfopen_s进行读或写操作的时候,只能进行一次操作(即只能进行一次读写操作),注意:当你在不同的地方对某一文件只要使用过一次fopen_s 或 _wfopen_s,这个文件就变成非共享的文件了,再次进行读写的时候,就可能会返回int error = 13也就是EACCES (Permission denied)的错误。我在项目中就是只改了一个地方,结果二次读写的时候仍然不对,需要将所有涉及此文件读写的地方都改成_fsopen, _wfsopen的读写方式。
文件共享的二进制写操作的代码为:FILE *fp = _wfsopen(tmpFile, _T("wb"), _SH_DENYNO);