使用c#从azure文件存储中递归获取文件

本文关键字:文件 递归 获取 存储 使用 azure | 更新日期: 2023-09-27 17:58:06

我想写一个程序从azure文件存储中获取文件,但问题是没有定义目录的深度,文件的isFile属性总是返回false。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using Microsoft.Azure; // Namespace for Azure Configuration Manager
using Microsoft.WindowsAzure.Storage; // Namespace for Storage Client Library
using Microsoft.WindowsAzure.Storage.Blob; // Namespace for Blob storage
using Microsoft.WindowsAzure.Storage.File; // Namespace for File storage
namespace AzureStorage
{
    class Program
    {
        static void Main(string[] args)
        {
            CloudStorageAccount storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageConnectionString"));
            //CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
            // Create a CloudFileClient object for credentialed access to File storage.
            CloudFileClient fileClient = storageAccount.CreateCloudFileClient();
            // Get a reference to the file share we created previously.
            CloudFileShare share = fileClient.GetShareReference("my-FileShare");
            // Ensure that the share exists.
            if (share.Exists())
            {
                // Get a reference to the root directory for the share.
                CloudFileDirectory rootDir = share.GetRootDirectoryReference();

                // Get a reference to the directory we created previously.
                CloudFileDirectory sampleDir = rootDir.GetDirectoryReference("FILES");
                // Ensure that the directory exists.
                if (sampleDir.Exists())
                {
                    var directoryLists = sampleDir.ListFilesAndDirectories();
                    //sampleDir.ge
                    foreach (var yearDirTemp in directoryLists)
                    {
                        var yearDir = sampleDir.GetDirectoryReference(
                                        Path.GetFileNameWithoutExtension(yearDirTemp.Uri.LocalPath)
                                        );
                        foreach (var monthDirTemp in yearDir.ListFilesAndDirectories())
                        {
                            var monthDir = yearDir.GetDirectoryReference(
                                            Path.GetFileNameWithoutExtension(monthDirTemp.Uri.LocalPath)
                                            );
                            foreach (var patientDirTemp in monthDir.ListFilesAndDirectories())
                            {
                                var patientDir = monthDir.GetDirectoryReference(
                                                   Path.GetFileNameWithoutExtension(patientDirTemp.Uri.LocalPath)
                                                   );
                                foreach (var patientDataTemp in patientDir.ListFilesAndDirectories())
                                {
                                    var patientData = patientDir.GetDirectoryReference(
                                                   Path.GetFileNameWithoutExtension(patientDataTemp.Uri.LocalPath)
                                                   );
                                   var fileList = patientData.ListFilesAndDirectories();
                                    foreach(var fileTemp in fileList)
                                    {
                                        // Here fileTemp could be file 
                                        // or directory containing more child directories
                                        var file1 = patientData.GetFileReference(Path.GetFileName(fileTemp.Uri.LocalPath));
                                        file1.FetchAttributes();
                                        byte[] arrTarget = new byte[file1.Properties.Length];
                                        file1.DownloadToByteArray(arrTarget, 0);                                        
                                    }
                                }
                            }
                        }                        
                    }
                }
            }
        }
    }
}

使用c#从azure文件存储中递归获取文件

    public static void list_file()
    {
        //***** Get list of all files/directories on the file share*****//
        CloudStorageAccount cloudStorageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("xxxxxxxxxxxxxxxxxxxxxx_AzureStorageConnectionString"));
        CloudFileClient fileClient = cloudStorageAccount.CreateCloudFileClient();
        CloudFileShare fileShare = fileClient.GetShareReference("dummyfile");
        // List all files/directories under the root directory.
        Console.WriteLine("Getting list of all files/directories under the root directory of the share.");
        IEnumerable<IListFileItem> fileList = fileShare.GetRootDirectoryReference().ListFilesAndDirectories();
        // Print all files/directories listed above.
        foreach (IListFileItem listItem in fileList)
        {
            // listItem type will be CloudFile or CloudFileDirectory.
            Console.WriteLine(listItem.Uri.Segments.Last());
            Console.WriteLine(listItem.GetType());
            if(listItem.GetType()== typeof(Microsoft.WindowsAzure.Storage.File.CloudFileDirectory))
            {
                list_subdir(listItem);
            }
        }
    }
    public static void list_subdir(IListFileItem list)
    {
        Console.WriteLine("subdir");
        CloudFileDirectory fileDirectory=(CloudFileDirectory)list;
        IEnumerable<IListFileItem> fileList = fileDirectory.ListFilesAndDirectories();

        // Print all files/directories in the folder.
        foreach (IListFileItem listItem in fileList)
        {
            // listItem type will be CloudFile or CloudFileDirectory.
            Console.WriteLine(listItem.Uri.Segments.Last());
        }
    }

目录的深度没有定义,文件的isFile属性总是返回false。

如果您想在fileTemp为File时执行一些操作,请尝试使用以下代码。我们可以使用GetType方法获取其类型,然后使用name属性获取其类型值。如果值是"CloudFile",那么我们会执行一些操作,例如下载等等

 foreach (var fileTemp in fileList)
 {
     // Here fileTemp could be file 
     // or directory containing more child directories
     switch (fileTemp.GetType().Name)
     {
         case "CloudFile":
             var file1 = patientData.GetFileReference(Path.GetFileName(fileTemp.Uri.LocalPath));
             file1.FetchAttributes();
             byte[] arrTarget = new byte[file1.Properties.Length];
             file1.DownloadToByteArray(arrTarget, 0);
             break;
         case "CloudFileDirectory":
             break;
     }
 }