[ad_1]
我有一个带有 zip 文件的 Azure 文件共享目录,例如 abc.zip。
我想用 C# Azure 函数中的 C# 代码解压缩它。
我所拥有的是正确填充的 CloudFileDirectory。 现在我想调用一个方法来解压缩此 Azure 文件共享目录中的文件。
该方法的名称为“public static async Task
我尝试了很多代码,但似乎没有任何效果。 我尝试的最后一个代码是尝试从 CloudFile 创建流。
代码行“using (var zipArchive = new ZipArchive(stream))”给了我一个错误(catch) =>“无法找到中央目录记录结尾。”
我做错了什么?
我尝试过的:
C#
public static async Task<ResultHelper> ExtractZipFileCloudStorageAsync(CloudFileDirectory extractDirectory) { try { var zipFiles = await extractDirectory.ListFilesAndDirectoriesSegmentedAsync(null); using (var httpClient = new HttpClient()) { foreach (var zipFile in zipFiles.Results) { if (zipFile is CloudFile file && file.Uri.AbsoluteUri.EndsWith(".zip", StringComparison.OrdinalIgnoreCase)) { var zipFileBytes = await GetMemoryStreamAsync(file); using (var stream = new MemoryStream(zipFileBytes.GetBuffer())) { using (var zipArchive = new ZipArchive(stream)) { } } } } return ... } catch (Exception ex) { return ... } } }
解决方案1
我重建了它,现在它可以工作了=>
C#
public static class ExtractZipFileHelper { /// <summary> /// Extract zip file for Azure fileshare folders (cloud directory). /// </summary> /// <param name="extractDirectory"></param> /// <returns></returns> public static async Task<ResultHelper> ExtractZipFileCloudStorageAsync(CloudFileDirectory extractDirectory) { try { if (extractDirectory == null) { return ResultHelper.CreateResultHelper(false, "The parameter 'extractDirectory' is empty or NULL!"); } return await ExtractZipFileAsync(extractDirectory); } catch (Exception ex) { return ResultHelper.CreateResultHelper(false, $"Error while extracting zip files: {ex.Message}"); } } /// <summary> /// Extract all zip files in the extractDirectory. /// </summary> /// <param name="extractDirectory"></param> /// <returns></returns> private static async Task<ResultHelper> ExtractZipFileAsync(CloudFileDirectory extractDirectory) { try { var filesAndDirectories = await extractDirectory.ListFilesAndDirectoriesSegmentedAsync(null); // Loop through all entries in the CloudFileDirectory. foreach (var item in filesAndDirectories.Results) { // Verify that the item is a CloudFile. if (item is CloudFile cloudFile) { // Check if the item ends in '.zip'. if (cloudFile.Name.EndsWith(".zip")) { // Create a MemoryStream for the contents of the zip file. using (MemoryStream memoryStream = new MemoryStream()) { // Download the contents of the zip file to the MemoryStream. await cloudFile.DownloadToStreamAsync(memoryStream); // Use a ZipArchive to read the contents of the zip file. using (ZipArchive zipArchive = new ZipArchive(memoryStream)) { // Walk through all entries in the zip file. foreach (ZipArchiveEntry entry in zipArchive.Entries) { // Get a reference to the CloudFile object for each entry. CloudFile entryFile = extractDirectory.GetFileReference(entry.FullName); // Create a MemoryStream for the entry content. using (MemoryStream entryStream = new MemoryStream()) { // Open the entry in the zip file. using (Stream entryFileStream = entry.Open()) { // Copy the entry content to the MemoryStream. await entryFileStream.CopyToAsync(entryStream); } entryStream.Position = 0; // Upload the contents to the corresponding CloudFile. await entryFile.UploadFromStreamAsync(entryStream); } } } } } } } return ResultHelper.CreateResultHelper(true); } catch (Exception ex) { return ResultHelper.CreateResultHelper(false, $"Error while extracting zip files: {ex.Message}"); } } }
[ad_2]
コメント