我想编写一个程序来从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);
}
}
}
}
}
}
}
}
}
}
答案 0 :(得分:3)
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());
}
}
答案 1 :(得分:1)
目录深度未定义,文件的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;
}
}