c# - 如何在azure中移动目录并在azure文件共享中使用ShareDirectoryClient对其进行ZIP

标签 c# .net azure azure-sdk-.net sharpziplib

我能够使用 ShareDirectoryClient 成功移动 azure 中的目录。

using System;
using System.Threading.Tasks;
using Azure.Storage.Files.Shares;

namespace SO69798149
{
    class Program
    {
        const string MyconnectionString = "DefaultEndpointsProtocol=https;AccountName=account-name;AccountKey=account-key";
        const string MyshareName = "share-name";
        const string SourceDirectoryName = "source-directory-name";
        private const string RenamedDirectoryName = "new-directory-name";
        
        static async Task Main(string[] args)
        {
            ShareClient myshare = new ShareClient(MyconnectionString, MyshareName);
            ShareDirectoryClient sourceDirectoryClient = myshare.GetDirectoryClient(SourceDirectoryName);
            ShareDirectoryClient targetDirectoryClient = myshare.GetDirectoryClient(RenamedDirectoryName);
            await RenameDirectory(sourceDirectoryClient, targetDirectoryClient);
            Console.WriteLine("Directory renamed.");
        }

        static async Task RenameDirectory(ShareDirectoryClient sourceDirectoryClient,
            ShareDirectoryClient targetDirectoryClient)
        {
            //Create target directory
            await targetDirectoryClient.CreateIfNotExistsAsync();
            //List files and folders from the source directory
            var result = sourceDirectoryClient.GetFilesAndDirectoriesAsync();
            await foreach (var items in result.AsPages())
            {
                foreach (var item in items.Values)
                {
                    if (item.IsDirectory)
                    {
                        //If item is directory, then get the child items in that directory recursively.
                        await RenameDirectory(sourceDirectoryClient.GetSubdirectoryClient(item.Name),
                            targetDirectoryClient.GetSubdirectoryClient(item.Name));
                    }
                    else
                    {
                        //If item is file, then copy the file and then delete it.
                        var sourceFileClient = sourceDirectoryClient.GetFileClient(item.Name);
                        var targetFileClient = targetDirectoryClient.GetFileClient(item.Name);
                        await targetFileClient.StartCopyAsync(sourceFileClient.Uri);
                        await sourceFileClient.DeleteIfExistsAsync();
                    }
                }
            }
            //Delete source directory.
            await sourceDirectoryClient.DeleteIfExistsAsync();
        }
        
    }
}

我正在使用 ShareDirectoryClient 在 azure 中移动目录。这里我们如何在移动文件夹后对其进行压缩。

我的方法:

using System.IO.Compression;
ZipFile.CreateFromDirectory(sourceDirectoryClient.Path, targetDirectoryClient.Path);

错误:找不到路径“/app/NewFolder/test.zip”的一部分。

请协助我解决问题

注意:我们还可以使用下面的库 https://github.com/icsharpcode/SharpZipLib

Zipping a directory using C# and SharpZipLib

void fastcompressDirectory(string DirectoryPath, string OutputFilePath, int CompressionLevel = 9)
{
    ICSharpCode.SharpZipLib.Zip.FastZip z = new ICSharpCode.SharpZipLib.Zip.FastZip();
    z.CreateEmptyDirectories = true;
    z.CreateZip(OutputFilePath, DirectoryPath, true, "");

    if (File.Exists(OutputFilePath))
        Console.WriteLine("D0ne");
    else
        Console.WriteLine("Failed");
}

上面的代码会将所有文件夹内容压缩到一个新的 zip 文件中。我们如何在 azure sharedirectoryclient 目录中实现相同的效果。

最佳答案

我的理解是,您想要压缩 Azure 文件共享中的目录并将结果 zip 存档存储在同一个 Azure 文件共享上。

您遇到的 ZipFile.CreateFromDirectory 问题与路径和执行代码的位置有关。如果您替换这些路径,您将得到类似的内容:

ZipFile.CreateFromDirectory("/app/NewFolder", "/app/NewFolder.zip");

这些路径被视为您的应用程序的本地路径(如果您的应用程序位于 C:\MyApp 中,那么它们将解析为 C:\MyApp\app\NewFolder) 。 ZipFile 不使用 Azure 文件共享,这是主要问题。

您可以尝试使用 Azure 数据工厂来压缩文件夹,或者 Josefs Ottosson tutorial如果您想在代码中实现这一点,将会很有帮助。

或者,如果您将共享附加到运行应用程序的计算机,那么您可以使用此方法,然后您可以操作该计算机上的文件。

关于c# - 如何在azure中移动目录并在azure文件共享中使用ShareDirectoryClient对其进行ZIP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74393708/

相关文章:

c# - 为什么c#编译器允许返回值类型和变量类型的错误匹配?

c# - C# NetworkStream.Read() 会等到读取指定数量的数据吗?

c# - MSMQ 和 LINQ 实体对象序列化异常

c# - 为什么我的 RichTextBox 没有更改前景色数据绑定(bind)

azure - 如何停止/取消正在运行的 Azure Web 作业?

asp.net - 指定用于持续部署到 Azure Web 应用程序的配置转换

c# - 在 C# 中查找子数组的第一次出现/起始索引

c# - 从 C# 创建 IronPython 类的实例

.net - 使用 Visual Basic 在 Windows 窗体中嵌入 DOS 控制台

azure - 由于防火墙的原因,无法从 VM 访问 Azure Blob 存储