我下面的代码需要从Azure文件共享中获取列表。
从共享的属性中可以看到,我在5个文件夹中有17个文件,但是此代码返回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;
}
}
答案 0 :(得分: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
将返回值添加到{ {1}}。
现在files
包含C,D,E,C,D和E。
循环继续并添加A和B,使files
的内容为C,D,E,C,D,E,A,B
瞧。 8个文件,而不是预期的5个。
如果你输了files
,那你应该很好。
顺便说一句,Visual Studio允许您将本地调试器附加到Azure上的应用程序,这使调试服务器端代码变得轻而易举。