【问题标题】:How to create ShareFileClient without specifying it's size to be able to stream data to it?如何创建 ShareFileClient 而不指定它的大小以便能够将数据流式传输到它?
【发布时间】:2021-03-23 01:51:05
【问题描述】:

我想使用 .NET api 在 Azure FileShare 资源中的 FileShareClient 上创建新的 blob。我不能在一开始就指定它的大小(因为它稍后会被数据填充,例如用行填充的 csv 文件,最多几 GB)。

我试图在我的代码中使用这样的东西:

using Azure.Storage.Files.Shares

  ShareFileClient fileShare = new ShareFileClient(
            "MYConnectionString",
            "FileShareName",
            "TestDirectoryName");
  if (!fileShare.Exists())
        {
            fileShare.Create(0);
        }
var stream = fileShare.OpenWrite(true, 0);

[编辑] 我有一个例外: System.ArgumentException: 'options.MaxSize must be set if overwrite is set to true' 有没有办法避免指定这个大小?

【问题讨论】:

    标签: c# .net azure fileshare


    【解决方案1】:

    请尝试使用最新的包Azure.Storage.Files.Shares, version 12.5.0

    注意,在代码new ShareFileClient()中,最后一个参数是directory name + file name

    请看下面的代码:

            ShareFileClient f2 = new ShareFileClient(connectionString, shareName, dirName + "/test.txt");
            if (!f2.Exists())
            {
                f2.Create(0);
            }
    

    可以创建大小为0的文件,测试结果如下:

    【讨论】:

    • 我已经尝试过您的解决方案,但是当我尝试以这种方式打开写入时: var stream = f2.OpenWrite(true, 0);我有一个例外: System.ArgumentException: 'options.MaxSize must be set if overwrite is set to true' 有没有办法避免指定这个大小?
    • @JacknJ,如果您将true 设置为OpenWrite 方法,答案是否定的。如果你想覆盖文件,设置 MaxSize 很容易(它应该比你要上传的数据更大)。例如:ShareFileOpenWriteOptions options = new ShareFileOpenWriteOptions{ MaxSize = 30}; var openwrite_stream = f2.OpenWrite(true, 0,options:options);
    • @JacknJ,您好,如果答案有帮助,请您接受它作为答案:)。谢谢。如果您还有更多问题,请@我。
    【解决方案2】:

    Micro$ofts 无限智慧:Resize 隐藏在 SetHttpHeaders 方法中。

    public void AppendFile(string filePath, byte[] data)
    {
        ShareFileClient fileShare = new ShareFileClient(connectionString, shareClient.Name, filePath);
        if (!fileShare.Exists())
            fileShare.Create(0);
    
        for (int i = 0; i < 10; i++)
        {
            var properties = fileShare.GetProperties();
            var openOptions = new ShareFileOpenWriteOptions();
    
            fileShare.SetHttpHeaders(properties.Value.ContentLength + data.Length);
    
            var stream = fileShare.OpenWrite(false, properties.Value.ContentLength, openOptions);
    
            stream.Write(data, 0, data.Length);
    
            stream.Flush();
        }
    }
        
    

    【讨论】:

      猜你喜欢
      • 2022-11-22
      • 1970-01-01
      • 2021-06-10
      • 2015-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-26
      相关资源
      最近更新 更多