У нас есть несколько приложений C ++ для Windows 8 Store, которые должны поддерживать конфигурацию и файлы данных.
Файлы записаны в подпапках 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?
Есть ли не ascii символы в пути к appdata? CreateDirectory имеет версию Unicode, но fopen занимает const char*
Строки в качестве аргумента.
На вашем месте я бы попытался абстрагироваться от вызовов, специфичных для ОС, используя что-то вроде boost или Qt. Это должно работать, потому что Qt использует Unicode-строку для открытия файлов, а Boost должен иметь что-то подобное (не уверен насчет этого).
Также на компиляторе Windows _wfopen
может присутствовать. Это так же, как fopen, но занимает wchar_t
Строки в качестве аргумента. Это должно работать для вас, но вам понадобится несколько ifdefs
здесь и там.
Вы также можете попробовать установить текущий каталог с функцией, поддерживающей Unicode, и затем вызвать fopen
, но я бы не назвал это «чистым» решением.
В любом случае, когда вы сталкиваетесь с проблемой, которая связана с системными вызовами, то на машине с проблемой вы можете отслеживать вызовы, используя что-то вроде монитор процесса. Вы можете проинструктировать пользователя с проблемой, чтобы сделать это и отправить вам журнал.
Почему бы вам не использовать Windows.Storage классы для работы с файловой системой? WinRT — рекомендуемый способ работы с IO, а не устаревшим C API. Я считаю, что это более надежный подход, и вы могли бы получить больше информации о причине из исключения WinRT, а не из-за неизвестного сбоя старого API.