Windows Store C ++应用程序无法使用Windows 8.1下的fopen()创建文件

时间:2013-11-13 16:11:39

标签: c++ windows-store-apps windows-8.1 winapp

我们有几个需要维护配置和数据文件的Windows 8商店C ++应用程序。

文件是在Windows::Storage::ApplicationData::Current->LocalFolder的子文件夹中编写的。例如:

C:\Users\<username>\AppData\Local\Packages\<packagename>\LocalState\SubFolder1\SubFolder2\data.txt

在Windows 8.1中,我们收到了一些用户的报告,他们说应用程序调用之间不会记住状态。仔细检查后,不会创建文件(确实创建了子文件夹,但其中没有文件)

注意:

  1. 使用CreateDirectory()创建子文件夹,使用fopen()

  2. 创建文件
  3. 使用绝对路径创建/打开文件

  4. 这始终在Windows 8.0下运行,并且代码从那时起就没有改变过。事实上,我们的一个用户报告表明该应用程序在Windows 8.0下保存了文件,但在用户升级到Windows 8.1后停止了保存。

  5. 我们无法使用Windows 8.1在本地复制此问题。我们不确定这种失败有多常见,但我们估计大多数用户不受影响。受影响的用户似乎没有任何特殊的硬件/软件配置。

  6. 如果用户受到影响,即使重试或卸载并重新安装应用程序(即不是间歇性故障的情况),也始终不会保存文件

  7. 很难得到错误信息(i)问题的罕见性(ii)根据定义显示此日志的日志未保​​存,以及(iii)应用程序不需要互联网连接因此没有其他通信渠道。

  8. 任何人都可以想到在Windows 8.1下这可能会失败的原因吗?

2 个答案:

答案 0 :(得分:1)

appdata路径中是否有非ascii字符? CreateDirectory具有unicode版本,但fopen将const char*个字符串作为参数。

如果我是你,我会尝试使用类似boost或Qt的东西来抽象出特定于操作系统的调用。这应该工作,因为Qt使用unicode字符串打开文件,Boost应该有类似的东西(不确定这个)。

同样在Windows上,编译器_wfopen可能存在。它与fopen相同,但以wchar_t个字符串作为参数。它应该适合你,但你需要一些ifdefs

你也可以尝试使用支持unicode的函数设置当前目录,然后调用fopen,但我不会称之为“干净”的解决方案。

无论如何,当您遇到与系统调用相关的问题时,在遇到问题的计算机上,您可以使用process monitor之类的内容监控呼叫。您可以指示用户遇到问题并向您发送日志。

答案 1 :(得分:0)

为什么不使用Windows.Storage类来处理文件系统? WinRT是推荐使用IO而非传统C API的方法。我相信它是更强大的方法,您可以从WinRT异常中获取有关原因的更多信息,而不是从旧API的未知故障中获取。