Xbox One CopyAsync не работает только в розничном режиме

В основном следующий код копирует всю папку из установки приложения в LocalCacheFolder, чтобы ими можно было манипулировать/обновлять. В этом случае содержимое папки с именем «Данные»

Этот код отлично работает на мобильных устройствах, настольных компьютерах и на Xbox в режиме разработки, но эта строка не работает на Xbox в розничном режиме:

await file.CopyAsync(destinationFolder, file.Name, NameCollisionOption.FailIfExists);

Это также при новой установке, поэтому я знаю, что файлы еще не существуют.

Есть ли другой способ добиться этого в розничном режиме, хотя теоретически весь код UWP должен работать на разных устройствах.

private async Task setupdatabase()
{
    StorageFolder destinationContainer = Windows.Storage.ApplicationData.Current.LocalCacheFolder;
    string root = Windows.ApplicationModel.Package.Current.InstalledLocation.Path;
    string path = root + @"\Data";

    StorageFolder sfolder = await StorageFolder.GetFolderFromPathAsync(path);

    await CopyFolderAsync(sfolder, destinationContainer);
}

public static async Task CopyFolderAsync(StorageFolder source, StorageFolder destinationContainer, string desiredName = null)
{
    StorageFolder destinationFolder = null;
    destinationFolder = await destinationContainer.CreateFolderAsync(desiredName ?? source.Name, CreationCollisionOption.OpenIfExists);

    foreach (var file in await source.GetFilesAsync())
    {
         await file.CopyAsync(destinationFolder, file.Name, NameCollisionOption.FailIfExists);
    }

    foreach (var folder in await source.GetFoldersAsync())
    {
         await CopyFolderAsync(folder, destinationFolder);
    }
}

person Stu Ayton    schedule 13.02.2017    source источник
comment
Не получается как? Выдает исключение или что?   -  person Clockwork-Muse    schedule 14.02.2017
comment
в этом проблема, так как он дает сбой только в розничном режиме, нет возможности подключить отладчик, чтобы увидеть, что происходит. Мне нужно внести правки, отправить в магазин, дождаться сертификации, установить на розничную коробку и снова пройти весь трудоемкий процесс. Я поместил текстовое поле на экран и обновил его значение после каждой команды, поэтому я знаю, где оно больше не работает, и попытался перехватить любое исключение с помощью блоков try{}catch(Exception e){}, но он просто пропускает код в улове   -  person Stu Ayton    schedule 14.02.2017


Ответы (2)


Похоже на ошибку с CopyAsync на Xbox в розничном режиме.

Замена:

await file.CopyAsync(destinationFolder, file.Name, NameCollisionOption.FailIfExists);

с:

StorageFile sourcefile = null;
string sourcefiletext = null;
            try
            {
                sourcefile = await source.GetFileAsync(file.Name);
                sourcefiletext = await FileIO.ReadTextAsync(sourcefile);
            }
            catch (Exception e)
            {
                Debug.WriteLine "Read source error:" + e.ToString();
            }

            try
            {

                StorageFile destfile = await destinationFolder.CreateFileAsync(file.Name, CreationCollisionOption.FailIfExists);
                await Windows.Storage.FileIO.WriteTextAsync(destfile, sourcefiletext);
            }
            catch (Exception e)
            {
                Debug.WriteLine "Write dest error:" + e.ToString();
            }

По сути, разбив его на 2 отдельные операции, проблема устранена, и теперь мое приложение работает нормально. Теперь это отправляется как отчет об ошибке

Обновление: не совсем ошибка, а функция от Microsoft:

Проблема здесь в том, что папка установки пакета зашифрована в розничном режиме Xbox. Пакет имеет разрешение на чтение собственных файлов, поэтому работает ReadTextAsync+WriteTextAsync. CopyAsync, с другой стороны, пытается скопировать файл со всеми атрибутами, связанными с файлом (включая шифрование).

person Stu Ayton    schedule 14.02.2017

Я не уверен, что это так, поскольку ваш код выглядит нормально, но как только я попал в ситуацию при запуске приложения локально предоставил ему некоторые привилегии. Может в этом случае тоже разные привилегии (для устройства/розничной?) - значит, можно попробовать зайти в папку не по ее пути, а напрямую через StorageFolder? Как это:

private async Task setupdatabase()
{
    StorageFolder sfolder = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFolderAsync("Data");
    await CopyFolderAsync(sfolder, ApplicationData.Current.LocalCacheFolder);
}

public static async Task CopyFolderAsync(StorageFolder source, StorageFolder destinationContainer, string desiredName = null)
{
    StorageFolder destinationFolder = await destinationContainer.CreateFolderAsync(desiredName ?? source.Name, CreationCollisionOption.OpenIfExists);

    var existingItems = await destinationFolder.GetFilesAsync(); // to check if files are already there
    foreach (var file in (await source.GetFilesAsync()).Where(x => !existingItems.Any(y => y.Name == x.Name)))
    {
        await file.CopyAsync(destinationFolder, file.Name);
    }

    foreach (var folder in await source.GetFoldersAsync())
    {
        await CopyFolderAsync(folder, destinationFolder);
    }
}

Во втором методе я изменил атрибут FailIfExists для проверки существующих элементов на случай возникновения проблемы.

person Romasz    schedule 14.02.2017
comment
Спасибо @Romasz, это отлично работает локально, теперь я скомпилировал приложение и отправил его в магазин, чтобы посмотреть, работает ли оно в режиме розничной продажи, и сообщу, как только узнаю - person Stu Ayton; 14.02.2017
comment
@StuAyton Вы также думали/пробовали использовать LocalFolder вместо LocalCacheFolder? - person Romasz; 14.02.2017
comment
Руководствуясь документацией по адресу docs.microsoft.com/en -us/uwp/api/ Данные LocalFolder копируются в облако, чего я не хотел, говорится в нем. Поэтому, если вы хотите сохранить данные и сохранить их локально на устройстве, вам следует рассмотреть возможность использования LocalCacheFolder. - person Stu Ayton; 14.02.2017
comment
Теперь я смог протестировать ваш код в розничном режиме и, к сожалению, столкнулся с той же проблемой, когда файл не копируется. - person Stu Ayton; 14.02.2017
comment
Странно, вообще код должен работать. Интересно, проблема только в LocalCacheFolder или в чем-то более глубоком? Можете ли вы проверить, используете ли вы LocalFolder, возникает та же проблема? - person Romasz; 14.02.2017
comment
Думаю, мне, возможно, придется пойти по этому пути, теперь мне удалось получить исключение из CopyAsync: System.UnauthorizedAccessException: доступ запрещен. (Excep_FromHResult 0x80070005) в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() в SharedLibrary!‹BaseAddress›+0x4511ee в SharedLibrary!‹BaseAddress›+0x451168 в SharedLibrary!‹BaseAddress›+0x699af7 в измерениях!‹BaseAddress62x5 - person Stu Ayton; 14.02.2017
comment
@StuAyton Я не уверен в этом случае. Поскольку это работает на других устройствах, возможно, вы можете опубликовать это как ошибку/проблему с голосом пользователя? - person Romasz; 14.02.2017
comment
В настоящее время я обсуждаю это с Microsoft, используя один из моих платных запросов в службу поддержки, возможно, если это действительно ошибка Xbox, они возместят мне это, лол. - person Stu Ayton; 14.02.2017
comment
@StuAyton Подай знак / ответь, когда что-то узнаешь. - person Romasz; 14.02.2017