2013-08-15 3 views
4

сейчас, я просто знаю, как скопировать файл с помощью:Копирование папки на WinRT

IStorageFolder dir = Windows.Storage.ApplicationData.Current.LocalFolder; 

IStorageFile file = await StorageFile.GetFileFromApplicationUriAsync(
    new Uri("ms-appx:///file.txt")); 

await file.CopyAsync(dir, "file.txt"); 

Когда я пытаюсь скопировать папку и все содержимое внутри, я не могу найти API как CopyAsync выше.

Можно ли скопировать папку и весь контент в WinRT?

+0

Какая ошибка у вас? –

+0

Я не могу найти API для папки копирования, например, файл с копией. – Crazenezz

+0

Получаете ли вы ошибку компилятора или ошибку компоновщика? –

ответ

5

Код выше не удовлетворяла меня (слишком специфичны), я сделал свой собственный так как я мог бы поделиться им:

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

     foreach (var file in await source.GetFilesAsync()) 
     { 
      await file.CopyAsync(destinationFolder, file.Name, NameCollisionOption.ReplaceExisting); 
     } 
     foreach (var folder in await source.GetFoldersAsync()) 
     { 
      await CopyFolderAsync(folder, destinationFolder); 
     } 
    } 
+0

При создании папки замените существующий, удалите старую папку (вместе с ее содержимым) или используя эту существующую папку в качестве адресата? – Kurotsuki

+0

Я бы сказал, что существующая папка заменена созданной пустой, поэтому существующий контент будет потерян. Но я не проверял, чтобы быть честным. –

1

Одним из возможных вариантов было бы использовать

StorageFolder.GetItemsAsync(); 

из Windows.Storage -namespace.

Результатом вызова является

IReadOnlyList<IStorageItem> 

, содержащий все файлы и папки в текущей папке. Затем вы можете работать над ними.

См. MSDN для получения дополнительной информации.

+0

Благодарим вас за информацию, но после того, как я снова проверил, результат из 'StorageFolder.GetItemsAsync()' is ' IReadOnlyList '. Пока я пытаюсь реализовать его с помощью рекурсивного, я обновлю код, когда это будет сделано. – Crazenezz

1

Основание на bash.d ответ, я произвожу свою собственную копию папки:

namespace Directories 
{ 
    private string ROOT = "root"; 

    public sealed partial class MainPage : Page 
    { 
     public MainPage() 
     { 
      this.InitializeComponent(); 

      CopyFolder(ROOT); 
     } 

     private async void CopyFolder(string path) 
     { 
      IStorageFolder destination = Windows.Storage.ApplicationData.Current.LocalFolder; 
      IStorageFolder root = Windows.ApplicationModel.Package.Current.InstalledLocation; 

      if (path.Equals(ROOT) && !await FolderExistAsync(ROOT)) 
       await destination.CreateFolderAsync(ROOT); 

      destination = await destination.GetFolderAsync(path); 
      root = await root.GetFolderAsync(path); 

      IReadOnlyList<IStorageItem> items = await root.GetItemsAsync(); 
      foreach (IStorageItem item in items) 
      { 
       if (item.GetType() == typeof(StorageFile)) 
       { 
        IStorageFile presFile = await StorageFile.GetFileFromApplicationUriAsync(
         new Uri("ms-appx:///" + path.Replace("\\", "/") + "/" + item.Name)); 

        // Do copy file to destination folder 
        await presFile.CopyAsync(destination); 
       } 
       else 
       { 
        // If folder doesn't exist, than create new one on destination folder 
        if (!await FolderExistAsync(path + "\\" + item.Name)) 
         await destination.CreateFolderAsync(item.Name); 

        // Do recursive copy for every items inside 
        CopyFolder(path + "\\" + item.Name); 
       } 
      } 
     } 

     private async Task<bool> FolderExistAsync(string foldername) 
     { 
      IStorageFolder destination = Windows.Storage.ApplicationData.Current.LocalFolder; 

      try 
      { 
       await destination.GetFolderAsync(foldername); 
       return true; 
      } 
      catch (Exception ex) 
      { 
       return false; 
      } 
     } 
    } 
} 

Этот пример использования root в корневой папке:

- root 
    - sub1 
    - sub1-1.txt 
    - sub1-2.txt 
    - sub1-3.txt 
    - sub1-4.txt 
    - sub2 
    - sub2-1.txt 
    - sub2-2.txt 
    - sub2-3.txt 
    - sub2-4.txt 
    - root1.txt 
    - root2.txt 
    - root3.txt 
    - root4.txt 

Он будет копировать из InstalledLocation папки в LocalFolder.

1

Не уверен, что если C# поддерживает метод Array.map, но это то, что код copyFolderAsync будет выглядеть на JavaScript

CreationCollisionOption = Windows.Storage.CreationCollisionOption; 
NameCollisionOption = Windows.Storage.NameCollisionOption; 

copyFolderAsync = function(sourceFolder, destFolder) { 
    return destFolder.createFolderAsync(sourceFolder.name, CreationCollisionOption.openIfExists).then(function(destSubFolder) { 
    return sourceFolder.getFilesAsync().then(function(files) { 
     return WinJS.Promise.join(files.map(function(file) { 
     return file.copyAsync(destSubFolder, file.name, NameCollisionOption.replaceExisting); 
     })); 
    }).then(function() { 
     return sourceFolder.getFoldersAsync(); 
    }).then(function(folders) { 
     return WinJS.Promise.join(folders.map(function(folder) { 
     return copyFolderAsync(folder, destSubFolder); 
     })); 
    }); 
    }); 
}; 
Смежные вопросы