0

我们有几个需要维护配置和数据文件的 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. 这在 Windows 8.0 下始终有效,此后代码未更改。事实上,我们的一份用户报告指出,该应用程序在 Windows 8.0 下可以正常保存文件,但在用户升级到 Windows 8.1 后停止保存。

  4. 我们无法使用 Windows 8.1 在本地复制该问题。我们不确定这种故障有多普遍,但我们估计大多数用户都没有受到影响。受影响的用户似乎没有任何特殊的硬件/软件配置。

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

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

谁能想到在 Windows 8.1 下这可能会失败的任何原因?

4

2 回答 2

1

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

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

_wfopen也可能存在Windows 编译器。它与 fopen 相同,但将wchar_t字符串作为参数。它应该对你有用,但你会ifdefs在这里和那里需要一些。

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

无论如何,当您遇到与系统调用相关的问题时,在有问题的机器上,您可以使用类似process monitor的东西来监控调用。您可以指示有问题的用户执行此操作并向您发送日志。

于 2013-11-19T11:11:43.880 回答
0

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

于 2013-11-13T16:55:19.127 回答