2013-11-13 6 views
0

У нас есть несколько приложений для Windows 8 Store C++, которым необходимо поддерживать файлы конфигурации и данных.Приложения Windows C++ Приложения не могут создавать файлы с помощью функции fopen() под Windows 8.1

Файлы написаны в подпапках Windows::Storage::ApplicationData::Current->LocalFolder. Пример:

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

В Windows 8.1 мы получили несколько сообщений от пользователей, которые говорят, состояние не запоминается между приложение заклятий. При внимательном файлы не создаются (вложенные папки действительно созданы, но нет файлов внутри них)

Примечание:

  1. Subfolders создано с использованием 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?

+0

'errno' /' GetLastError() '? Но сообщайте об этом Microsoft, у них все еще есть сотрудники, которые заботятся о таких регрессиях. – MSalters

+0

@MSalters: трудно получить информацию об ошибке (i) редкость проблемы (ii) тот факт, что журналы, которые обнаружат это, по определению не сохранены, и (iii) приложения не требуют подключения к интернету, поэтому нет альтернативного канала связи. Решение заключалось бы в том, чтобы как-то привязать сборку к тому, чтобы каким-то образом захватить/сообщить об этой ошибке, но я не решаюсь сделать это на живых сборках по довольно очевидным причинам :) – Xaxx

+0

Дикое предположение: содержат ли ваши имена несимвольные символы? – SigTerm

ответ

1

Есть ли символы без ascii в пути к appdata? CreateDirectory имеет версию unicode, но fopen принимает в качестве аргумента строки const char*.

Если бы я был вами, я бы попытался отвлечься от вызовов, связанных с ОС, используя что-то вроде boost или Qt. Это должно работать, потому что Qt использует строку unicode для открытия файлов, а Boost должен иметь что-то подобное (неуверенность в этом).

Также на компьютере Windows может присутствовать компилятор _wfopen. Это то же самое, что и fopen, но принимает в качестве аргумента строки wchar_t. Он должен работать для вас, но вам понадобятся несколько ifdefs здесь и там.

Вы также можете попробовать установить текущий каталог с функцией, поддерживающей unicode, а затем вызвать fopen, но я бы не назвал это «чистым» решением.

В любом случае, когда вы сталкиваетесь с проблемой, связанной с системными вызовами, то на машине с проблемой вы можете контролировать вызовы, используя что-то вроде process monitor. Вы можете указать пользователю проблему с этим и отправить вам журнал.

0

Почему вы не используете классы Windows.Storage для работы с файловой системой? WinRT рекомендуется использовать для работы с IO, а не с устаревшим C API. Я считаю, что это более надежный подход, и вы можете получить больше информации о причине из исключения WinRT, а не о неизвестном отказе старого API.

+2

Рекомендуется использовать Microsoft®, поскольку они приносят пользу, если ваше приложение привязано к Windows. Мои интересы включают в себя переносные программы, которые полностью противоположны. – MSalters

+0

@MSalters, это новый API, и предполагается, что он будет использоваться, если вы хотите иметь поддерживаемую мягкость. Никто не может гарантировать, что, скажем, в окнах 8.2 fopen и потоки вообще будут оставлены. Как getenv и _beginthreadex были. И если вы разрабатываете кросс-платформенные приложения, вы должны были уже знать, что вам нужна абстракция во многих API-интерфейсах системы. – ixSci

+0

Наша база кода обработки файлов используется совместно с Windows (настольным), Linux, Mac, iOS, Android, Windows Phone и Windows (RT), поэтому мы используем устаревший API C, чтобы поддерживать все как можно более распространенное/поддерживаемое. – Xaxx

 Смежные вопросы

  • Нет связанных вопросов^_^