【问题标题】:Alternative to fopen()'s mode "wx" for Windows fopen()?Windows fopen() 的 fopen() 模式“wx”的替代方案?
【发布时间】: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 竞争条件问题

标签: c windows fopen mode


【解决方案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 原语。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-04
  • 2010-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-23
  • 1970-01-01
相关资源
最近更新 更多