Как я могу заставить этот код просто получать файлы из общего файлового ресурса Azure?

#c# #azure-storage

#c# #azure-хранилище

Вопрос:

Мой приведенный ниже код должен получить список из моего общего файлового ресурса Azure.

Из свойств общего ресурса я вижу, что у меня есть 17 файлов в 5 папках, однако этот код возвращает 29.

Пример кода показан здесь, не уверен, сколько дополнительного текста этот редактор хочет, чтобы я добавил, прежде чем он разрешит мне опубликовать.

  class Program
    {
        private static List<CloudFile> files = new List<CloudFile>();

    static void Main(string[] args)
    {
        int xxx = 0;
        string accountName = "#######";
        string key = "#######";
        var storageAccount = new CloudStorageAccount(new StorageCredentials(accountName, key), true);
        var share = storageAccount.CreateCloudFileClient().GetShareReference("xfer");
        IEnumerable<IListFileItem> fileList = share.GetRootDirectoryReference().ListFilesAndDirectories();



        foreach (IListFileItem listItem in fileList)
        {
            if (listItem.GetType() == typeof(CloudFile))
            {
                files.Add((CloudFile)listItem);
            }
            else if (listItem.GetType() == typeof(CloudFileDirectory))
            {
               files.AddRange(list_subdir(listItem));
            }
        }

    }

    public static List<CloudFile>  list_subdir(IListFileItem list)
    {
        CloudFileDirectory fileDirectory = (CloudFileDirectory)list;
        IEnumerable<IListFileItem> fileList = fileDirectory.ListFilesAndDirectories();

        foreach (IListFileItem listItem in fileList)
        {
            if (listItem.GetType() == typeof(CloudFileDirectory))
            {
                list_subdir(listItem);
            }
            else
            {
                if (listItem.GetType() == typeof(CloudFile))
                {
                    files.Add((CloudFile) listItem);
                }
            }
        }
        return files;
    }


}
  

введите описание изображения здесь

Комментарии:

1. Привет, Дэйв, если вы запускаете свой код в Linqpad5, пожалуйста, включите эту информацию в свой вопрос. Спасибо.

2. Приведенный ниже ответ правильный, в предложении Main() -> else if вы можете просто использовать list_subdir(ListItem) , он отлично работает в linqpad5 и vs.

Ответ №1:

Ваша проблема заключается в files.AddRange . Вот что происходит: допустим, в вашем корневом каталоге есть два файла, A и B, и папка Foo . Foo, в свою очередь, содержит файлы C, D и E.

Ваш код находит Foo и вызывает list_subdir . На данный момент files все еще пусто. Ваш цикл внутри list_subdir находит C, D и E и добавляет их в files . На данный момент files содержит C, D и E. Теперь list_subdir возвращается files к вашему циклу внутри Main , где AddRange добавляется возвращаемое значение к files .

Теперь files содержит C, D, E, C, D и E.

Цикл продолжается и добавляет A и B, создавая содержимое files C, D, E, C, D, E, A, B

Et voila. 8 файлов вместо ожидаемых 5.

Если вы проиграете files.AddRange , все должно быть хорошо.

Кстати, Visual Studio позволяет подключать ваш локальный отладчик к приложению в Azure, что делает отладку подобного серверного кода непростой задачей.