Windows fopen() 的 fopen() 模式“wx”的替代方案?
Posted
技术标签:
【中文标题】Windows fopen() 的 fopen() 模式“wx”的替代方案?【英文标题】:Alternative to fopen()'s mode "wx" for Windows fopen()? 【发布时间】:2014-02-15 21:34:07 【问题描述】:我有一个基本程序,旨在复制 bash 的 cp 命令的功能。我正在为 UNIX 和 Windows 开发一个副本。我的 UNIX 版本运行良好,但是,我发现 Windows 不支持 fopen() 的“wx”模式选项,如下行所示:
file2 = fopen(argv[2], "wx");
是否有另一种方法可以在此处镜像 fopen 的 wx 功能模式?
(wx 允许打开具有写入权限的文件,但如果已存在具有相同文件名的文件,则会返回错误——这意味着您不会覆盖现有文件。请参阅here。
注意:尝试在 VS2013 的开发人员命令提示符中运行程序
【问题讨论】:
如果fopen
做不到,您可能必须使用带有CREATE_ALWAYS
作为dwCreationDisposition
参数的本机Win32 CreateFile
函数。
@AndrewMedico CREATE_NEW
.
file2 = PathFileExists(argv[2]) ? NULL : fopen(argv[2], "w");
@BLUEPIXY 竞争条件问题
【参考方案1】:
简短的回答是,您不能传递“wx”或任何等效于 fopen 的东西,这将产生 CreateFile
和 CREATE_NEW
。 fopen
根本不接受任何参数组合来产生它 - 它非常有限。您可以在 Visual Studio CRT 代码库中自己查看 fopen
的源代码!
但是,您可以直接致电CreateFile
。这可能是最好的方法。
或者,您可以调用_open
(http://msdn.microsoft.com/en-us/library/z0kc8e3z.aspx),它将采用参数_O_EXCL
,它可以产生CREATE_NEW
,因此如果文件按您的需要存在,它将导致它失败。
来自 CRT:
case _O_CREAT | _O_EXCL:
case _O_CREAT | _O_TRUNC | _O_EXCL:
filecreate = CREATE_NEW;
break;
【讨论】:
使用_open
和_O_EXCL
然后_fdopen
应该没问题...这样标准文件输出函数仍然可以使用而不是_write
原语。以上是关于Windows fopen() 的 fopen() 模式“wx”的替代方案?的主要内容,如果未能解决你的问题,请参考以下文章
在 Windows 核心文件上调用 fopen 返回 NULL 指针