2017-02-13 53 views
0

基本上以下代碼將整個文件夾從應用程序安裝複製到LocalCacheFolder中,以便它們可以被操縱/更新。在這種情況下,該文件夾的內容,稱爲「數據」僅在零售模式下失敗的Xbox One CopyAsync

此代碼的移動,桌面上和在Xbox的開發模式很好,但是這條線在零售模式在Xbox失敗:

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

這是也在全新安裝,所以我知道文件(S)不存在。

在零售模式中是否有不同的方式來實現這一點,雖然理論上所有的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); 
    } 
} 
+0

失敗如何?它會拋出一個異常,或者是什麼? –

+0

這就是問題所在,因爲它只在零售模式下失敗,所以沒有辦法連接調試器來查看發生了什麼。我必須進行編輯,提交給商店,等待認證,安裝在零售包裝箱上,並再次完成耗時的過程。我在屏幕上放置了一個文本框,並在每條命令後更新了它的值,以便我知道它不再工作的位置,並嘗試使用try {catch(Exception e){}塊捕獲任何異常,但它只是跳過catch中的代碼 –

回答

1

好像與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個獨立的操作固定的問題和我應用現在正常運行。這是目前正在提交的bug報告

更新:並不完全是錯誤的,但一個功能,從微軟:

這裏的問題是,包安裝文件夾在Xbox零售模式加密。一個包有權讀取它自己的文件,這就是ReadTextAsync + WriteTextAsync工作的原因。另一方面,CopyAsync嘗試複製與文件相關的所有屬性(包括加密)的文件。

0

我不知道是否會是這樣,因爲你的代碼看起來不錯,但once I've stepped in a situation運行本地應用程序授予它一些特權時。也許在這種情況下還有不同的權限(對於設備/零售?) - 因此,您是否可以嘗試通過其路徑訪問文件夾,但是直接使用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屬性對現有項目的體檢 - 萬一一個問題是存在的。

+0

感謝@Romasz,在當地工作正常,我已經編譯了應用程序並提交給商店,以便我可以看到這是否適用於零售模式,只要我知道就會報告回來 –

+0

@StuAyton您是否還想過/嘗試過使用* LocalFolder *而不是* LocalCacheFolder *? – Romasz

+0

按照https://docs.microsoft.com/en-us/uwp/api/Windows.Storage.ApplicationData#Windows_Storage_ApplicationData_LocalFolder中的說明進行操作。將LocalFolder數據備份到我不想要的雲,它說:因此,如果您想要保留數據並將其保留在本地設備上,您應該考慮使用LocalCacheFolder。 –

相關問題