我们有几个需要维护配置和数据文件的Windows 8商店C ++应用程序。
文件是在Windows::Storage::ApplicationData::Current->LocalFolder
的子文件夹中编写的。例如:
C:\Users\<username>\AppData\Local\Packages\<packagename>\LocalState\SubFolder1\SubFolder2\data.txt
在Windows 8.1中,我们收到了一些用户的报告,他们说应用程序调用之间不会记住状态。仔细检查后,不会创建文件(确实创建了子文件夹,但其中没有文件)
注意:
使用CreateDirectory()
创建子文件夹,使用fopen()
使用绝对路径创建/打开文件
这始终在Windows 8.0下运行,并且代码从那时起就没有改变过。事实上,我们的一个用户报告表明该应用程序在Windows 8.0下保存了文件,但在用户升级到Windows 8.1后停止了保存。
我们无法使用Windows 8.1在本地复制此问题。我们不确定这种失败有多常见,但我们估计大多数用户不受影响。受影响的用户似乎没有任何特殊的硬件/软件配置。
如果用户受到影响,即使重试或卸载并重新安装应用程序(即不是间歇性故障的情况),也始终不会保存文件
很难得到错误信息(i)问题的罕见性(ii)根据定义显示此日志的日志未保存,以及(iii)应用程序不需要互联网连接因此没有其他通信渠道。
任何人都可以想到在Windows 8.1下这可能会失败的原因吗?
答案 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的未知故障中获取。