gpt4 book ai didi

c# - 无法使用 ShareDirectoryClient 在 azure 中移动目录

转载 作者:行者123 更新时间:2023-12-03 00:55:35 31 4
gpt4 key购买 nike

通常我们可以使用移动目录

    // source is: "C:\Songs\Elvis my Man"
// newLocation is: "C:\Songs\Elvis"

try
{
// Previous command was: Directory.Move(source, newLocation);
DirectoryInfo dir = new DirectoryInfo(source);
dir.MoveTo(newLocation);
}

catch (Exception e)
{
Console.WriteLine("Error: "+ e.Message);
}

现在,当使用 azure 时:

        string myconnectionString = ConfigurationManager.ConnectionStrings["StorageConnection"].ConnectionString.ToString();
string myshareName = "Mysampleshare";
string mydirName = "Mysampledir";
// Get a reference to a share and then create it
ShareClient myshare = new ShareClient(myconnectionString, myshareName);
ShareDirectoryClient directory1 = myshare.GetDirectoryClient(mydirName);


string myshareName2 = "Mysampleshare2";
string mydirName2 = "Mysampledir2";
// Get a reference to a share and then create it
ShareClient myshare2 = new ShareClient(myconnectionString, myshareName2);
ShareDirectoryClient directory2 = myshare2.GetDirectoryClient(mydirName2);
Directory.Move(directory1.Path, directory2.Path);

我无法使用 azure 将目录从一个位置移动到另一个位置。我遇到了异常。

DirectoryNotFoundException: The path specified by sourceDirName is invalid 

请提出您的建议。

最佳答案

ShareDirectoryClient 本质上实现了 Azure 文件服务 REST API,因此您无法使用 System.IO 操作(例如 Directory.Move)。

有两种可能的解决方案:

  1. 如果您想使用SDK,您需要做的就是在源目录中递归列出文件和目录,然后将单个文件从源目录复制到目标目录。您还需要在目标目录中创建目录。复制操作完成后,您将需要从源目录中删除所有文件和目录。只有当源目录为空时,您才可以删除源目录。

您需要执行所有这些操作,因为 REST API 本身并不支持移动操作。要完成移动,您需要执行复制操作,然后执行删除操作。

  • 如果您想使用System.IO,则需要将文件共享安装为共享网络驱动器,以便获得分配给该文件共享的驱动器号。完成后,您将能够使用 System.IO 命名空间中提供的 Directory.Move 等操作。
  • 更新

    请尝试以下代码:

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

    }
    }

    关于c# - 无法使用 ShareDirectoryClient 在 azure 中移动目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69798149/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com