Windows 8 如何在Windows应用商店应用程序中复制文件夹

Windows 8 如何在Windows应用商店应用程序中复制文件夹,windows-8,windows-store-apps,windows-8.1,Windows 8,Windows Store Apps,Windows 8.1,如何在Windows应用商店应用程序中复制文件夹及其内容 我正在为Windows应用商店应用程序编写测试。应用程序处理文件,因此需要一组已知文件。理想情况下,任何开发人员都可以运行这些测试,而无需进行一些手动设置 我假设这意味着测试文件将签入源代码管理,然后复制到LocalState文件夹中,测试可以在那里使用它们(在ClassInitialize测试阶段复制) StorageFile具有复制功能。可以使用它们递归地重建要复制的文件夹。然而,很难相信这是正确的方法。。。我肯定漏掉了什么。这很粗糙

如何在Windows应用商店应用程序中复制文件夹及其内容

我正在为Windows应用商店应用程序编写测试。应用程序处理文件,因此需要一组已知文件。理想情况下,任何开发人员都可以运行这些测试,而无需进行一些手动设置

我假设这意味着测试文件将签入源代码管理,然后复制到
LocalState
文件夹中,测试可以在那里使用它们(在
ClassInitialize
测试阶段复制)


StorageFile具有复制功能。可以使用它们递归地重建要复制的文件夹。然而,很难相信这是正确的方法。。。我肯定漏掉了什么。

这很粗糙,没有经过彻底的测试。它以递归方式复制文件夹。对于名称冲突,它将覆盖现有文件和文件夹

    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);
        }
    }

求你了,有人有更好的答案。复制文件夹应该是对已测试的.net API的一行调用。我们不必编写自己的函数,也不必从internet复制粘贴未经测试的代码。

这是我复制文件夹的版本,如果在
IStorageFolder上有3种扩展方法的话:

  • 所有文件和文件夹的浅拷贝
  • 所有文件和文件夹的递归副本
  • 只复制文件
  • 代码:

    公共静态类StorageFolderExtensions
    {
    /// 
    ///文件和文件夹从源到目标的递归拷贝。
    /// 
    公共静态异步任务CopyContentsRecursive(此IStorageFolder源,IStorageFolder dest)
    {
    等待CopyContentsShallow(源、目标);
    var subfolders=await source.GetFoldersAsync();
    foreach(子文件夹中的var storageFolder)
    {
    wait storageFolder.copycontentsrescursive(wait dest.GetFolderAsync(storageFolder.Name));
    }
    }
    /// 
    ///从源到目标的文件和文件夹的浅拷贝。
    /// 
    公共静态异步任务CopyContentsShallow(此IStorageFolder源,IStorageFolder目标)
    {
    等待源.CopyFiles(目标);
    var items=await source.GetFoldersAsync();
    foreach(项目中的var storageFolder)
    {
    等待destination.CreateFolderAsync(storageFolder.Name,CreationCollisionOption.ReplaceExisting);
    }
    }
    /// 
    ///将文件从源文件夹复制到目标文件夹。
    /// 
    专用静态异步任务复制文件(此IStorageFolder源,IStorageFolder目标)
    {
    var items=await source.getfileasync();
    foreach(项目中的var-storageFile)
    {
    等待storageFile.CopySync(目标,storageFile.Name,NameCollisionOption.ReplaceExisting);
    }
    }
    
    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);
            }
        }