如何使用Azure Function在Azure文件共享中解压缩文件?

问题描述

我有一个具有Azure文件共享的Azure存储帐户。我想使用Azure函数将zip存档文件提取文件共享中的另一个目录中。我用C#编写了这段代码

    CloudFileDirectory rootDirectory = cloudFileShare.GetRootDirectoryReference();
    CloudFileDirectory output = rootDirectory.GetDirectoryReference("output");
    CloudFile cloudFile = input.GetFileReference("archive1.zip");
    
    using (var stream = await cloudFile.OpenReadAsync())
    {

       var file1 = new ZipArchive(stream);

       foreach (var zipEntry in file1.Entries)
       {

          var file2 = output.GetFileReference(zipEntry.Name);

          var fileStream = zipEntry.open();

          await file2.UploadFromStreamAsync(fileStream); //error is in this line

        }

   }

但是我得到了错误

System.Private.CoreLib: Exception while executing function: HttpTriggerExtract. Microsoft.WindowsAzure.Storage: 
Operation is not valid due to the current state of the object.

该如何解决

编辑:此外,我还使用MemoryStream修复了该错误,此代码有效:

        foreach (var zipEntry in file1.Entries) {

            var fsz = output.GetFileReference(zipEntry.Name);

            using (var ms = new MemoryStream())
            {

                using (var fileStream = zipEntry.open())
                {
                    await fileStream.copyToAsync(ms);

                    ms.Seek(0,SeekOrigin.Begin);
                    await fsz.UploadFromStreamAsync(ms);

                }

            }

解决方法

关于此问题,请参考以下代码(我使用软件包WindowsAzure.Storage 9.3.1来做到这一点)

            CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);
            CloudFileClient cloudFileClient = storageAccount.CreateCloudFileClient();
            CloudFileShare cloudFileShare = cloudFileClient.GetShareReference("share2");
            CloudFileDirectory rootDirectory = cloudFileShare.GetRootDirectoryReference();
            CloudFileDirectory input = rootDirectory.GetDirectoryReference("input");
            CloudFileDirectory output = rootDirectory.GetDirectoryReference("output");
            CloudFile cloudFile = input.GetFileReference("sample.zip");
            using (var stream = await cloudFile.OpenReadAsync())
            using (var zipArchive = new ZipArchive(stream)) {
                foreach (var entry in zipArchive.Entries)
                {
                    if (entry.Length > 0) {
                        CloudFile extractedFile = output.GetFileReference(entry.Name);

                        using (var entryStream = entry.Open())
                        {
                            byte[] buffer = new byte[16 * 1024];
                            using (var ms = await extractedFile.OpenWriteAsync(entry.Length))
                            {
                                int read;
                                while ((read = await entryStream.ReadAsync(buffer,buffer.Length)) > 0)
                                {
                                    ms.Write(buffer,read);
                                }
                            }
                        }
                    }
                
                }

            }

enter image description here