#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, что делает отладку подобного серверного кода непростой задачей.