如何在Windows Store应用程序中复制文件夹

3

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

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

我假设这意味着测试文件将被检入源代码控制,然后复制到LocalState文件夹,以便测试可以使用它们(在ClassInitialize测试阶段期间进行复制)。

StorageFile具有复制功能。可以使用这些功能递归重建要复制的文件夹。但是很难相信这将是正确的方法...我肯定错过了什么。

2个回答

5

这是一个初步的版本,没有经过充分测试。它可以递归地复制文件夹。对于名称冲突,它会覆盖现有的文件和文件夹。

    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。我们不应该都需要编写自己的函数或从互联网上复制未经测试的代码。


0

这是我复制文件夹的版本,它有3个扩展方法在 IStorageFolder 上:

  1. 浅复制所有文件和文件夹
  2. 递归复制所有文件和文件夹
  3. 仅复制文件

代码:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接