我的代码需要从我的Azure文件共享中获取一个List。
我可以从共享的属性中看到我在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;
}
}
你的问题在于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的内容
瞧瞧。 8个文件而不是预期的5个。
如果你失去files.AddRange
你应该是好的。
顺便说一下,Visual Studio允许您将本地调试器附加到Azure上的应用程序,这使得像这样调试服务器端代码变得轻而易举。