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 的东西,这将产生 CreateFileCREATE_NEWfopen 根本不接受任何参数组合来产生它 - 它非常有限。您可以在 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 指针

将控制台应用程序更改为 Windows 应用程序后 fopen 失败

php中fopen函数的返回值是啥啊?

fopen() 不适用于 gvim 编辑器

使用 FOpen* 的 SQLite VFS 实施指南

Windows/Linux上使用fopen相关函数读取大文件