2014-06-07 6 views
2

Comment copier un dossier et son contenu dans Windows Store Apps? Je suis en train d'écrire des tests pour une application Windows Store. L'application fait des choses avec des fichiers, donc un ensemble de fichiers connus est nécessaire. Idéalement, n'importe quel développeur pourrait exécuter ces tests sans avoir besoin de faire une configuration manuelle.Comment copier un dossier dans une application Windows Store

Je suppose que les fichiers de test des moyennes seraient vérifiés dans le contrôle de source, puis copiés dans le dossier LocalState où les tests pourraient les consommer (copie pendant la phase de test ClassInitialize). StorageFile possède des fonctions de copie.

Il serait possible de les utiliser pour reconstruire récursivement le dossier à copier. Cependant, il est difficile de croire que ce serait la bonne approche ... il me manque sûrement quelque chose.

Répondre

4

Ceci est rugueux et pas complètement testé. Il copie les dossiers de manière récursive. Pour les collisions de noms, il écrase les fichiers et dossiers existants.

public static async Task CopyAsync(
     StorageFolder source, 
     StorageFolder destination) 
    { 
     // If the destination exists, delete it. 
     var targetFolder = await destination.TryGetItemAsync(source.DisplayName); 

     if (targetFolder is StorageFolder) 
      await targetFolder.DeleteAsync(); 

     targetFolder = await destination.CreateFolderAsync(source.DisplayName); 

     // Get all files (shallow) from source 
     var queryOptions = new QueryOptions 
     { 
      IndexerOption = IndexerOption.DoNotUseIndexer, // Avoid problems cause by out of sync indexer 
      FolderDepth = FolderDepth.Shallow, 
     }; 
     var queryFiles = source.CreateFileQueryWithOptions(queryOptions); 
     var files = await queryFiles.GetFilesAsync(); 

     // Copy files into target folder 
     foreach (var storageFile in files) 
     { 
      await storageFile.CopyAsync((StorageFolder)targetFolder, storageFile.Name, NameCollisionOption.ReplaceExisting); 
     } 

     // Get all folders (shallow) from source 
     var queryFolders = source.CreateFolderQueryWithOptions(queryOptions); 
     var folders = await queryFolders.GetFoldersAsync(); 

     // For each folder call CopyAsync with new destination as destination 
     foreach (var storageFolder in folders) 
     { 
      await CopyAsync(storageFolder, (StorageFolder)targetFolder); 
     } 
    } 

S'il vous plaît, quelqu'un a une meilleure réponse. La copie d'un dossier doit être un appel d'une ligne à une API .net testée. Nous ne devrions pas tous devoir écrire nos propres fonctions ou copier-coller du code non testé sur Internet.

0

Voici ma version pour les dossiers de copie, si a 3 méthodes d'extension sur IStorageFolder:

  1. copie superficielle de tous les fichiers et dossiers
  2. copie récursive de tous les fichiers et dossiers
  3. copie des fichiers de

code:

public static class StorageFolderExtensions 
{ 
    /// <summary> 
    /// Recursive copy of files and folders from source to destination. 
    /// </summary> 
    public static async Task CopyContentsRecursive(this IStorageFolder source, IStorageFolder dest) 
    { 
     await CopyContentsShallow(source, dest); 

     var subfolders = await source.GetFoldersAsync(); 
     foreach (var storageFolder in subfolders) 
     { 
      await storageFolder.CopyContentsRecursive(await dest.GetFolderAsync(storageFolder.Name)); 
     } 
    } 

    /// <summary> 
    /// Shallow copy of files and folders from source to destination. 
    /// </summary> 
    public static async Task CopyContentsShallow(this IStorageFolder source, IStorageFolder destination) 
    { 
     await source.CopyFiles(destination); 

     var items = await source.GetFoldersAsync(); 

     foreach (var storageFolder in items) 
     { 
      await destination.CreateFolderAsync(storageFolder.Name, CreationCollisionOption.ReplaceExisting); 
     } 
    } 

    /// <summary> 
    /// Copy files from source into destination folder. 
    /// </summary> 
    private static async Task CopyFiles(this IStorageFolder source, IStorageFolder destination) 
    { 
     var items = await source.GetFilesAsync(); 

     foreach (var storageFile in items) 
     { 
      await storageFile.CopyAsync(destination, storageFile.Name, NameCollisionOption.ReplaceExisting); 
     } 
    } 
Questions connexes