使用 .NET 版本 11.x 客户端库的 Azure 文件共享代码示例
本文介绍了使用适用于 .NET 的 Azure 文件共享客户端库版本 11.x 的代码示例。
2023 年 3 月 31 日,我们停用了对不符合当前 Azure SDK 指南的 Azure SDK 库的支持。 新的 Azure SDK 库会定期更新,以推动一致的体验并增强安全态势。 建议转换到新的 Azure SDK 库,以利用新功能和关键安全更新。
尽管 2023 年 3 月 31 日之后仍然可以使用较旧的库,但它们将不再从 Microsoft 获得官方支持和更新。 有关详细信息,请参阅支持停用公告。
先决条件
在项目的目录中安装以下包:
- Microsoft.Azure.Storage.Common
- Microsoft.Azure.Storage.File
- Microsoft.Azure.ConfigurationManager
然后,添加以下 using
指令:
using Microsoft.Azure; // Namespace for Azure Configuration Manager
using Microsoft.Azure.Storage; // Namespace for Storage Client Library
using Microsoft.Azure.Storage.Blob; // Namespace for Azure Blobs
using Microsoft.Azure.Storage.File; // Namespace for Azure Files
访问文件共享
添加以下代码以访问文件共享:
// Create a CloudFileClient object for credentialed access to Azure Files.
CloudFileClient fileClient = storageAccount.CreateCloudFileClient();
// Get a reference to the file share we created previously.
CloudFileShare share = fileClient.GetShareReference("logs");
// 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("CustomLogs");
// Ensure that the directory exists.
if (sampleDir.Exists())
{
// Get a reference to the file we created previously.
CloudFile file = sampleDir.GetFileReference("Log1.txt");
// Ensure that the file exists.
if (file.Exists())
{
// Write the contents of the file to the console window.
Console.WriteLine(file.DownloadTextAsync().Result);
}
}
}
设置文件共享的最大大小
从 Azure 文件存储客户端库的 5.x 版开始,可以设置文件共享的配额(最大大小)。 还可以查看共享当前存储了多少数据。
设置共享配额可以限制在该共享上存储的文件的总大小。 如果共享上的文件总大小超出了配额,则客户端无法增大现有文件的大小。 客户端也无法创建新文件,除非这些文件是空的。
下面的示例演示如何检查共享的当前使用情况,以及如何设置共享的配额。
// Parse the connection string for the storage account.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
Microsoft.Azure.CloudConfigurationManager.GetSetting("StorageConnectionString"));
// Create a CloudFileClient object for credentialed access to Azure Files.
CloudFileClient fileClient = storageAccount.CreateCloudFileClient();
// Get a reference to the file share we created previously.
CloudFileShare share = fileClient.GetShareReference("logs");
// Ensure that the share exists.
if (share.Exists())
{
// Check current usage stats for the share.
// Note that the ShareStats object is part of the protocol layer for the File service.
Microsoft.Azure.Storage.File.Protocol.ShareStats stats = share.GetStats();
Console.WriteLine("Current share usage: {0} GiB", stats.Usage.ToString());
// Specify the maximum size of the share, in GiB.
// This line sets the quota to be 10 GiB greater than the current usage of the share.
share.Properties.Quota = 10 + stats.Usage;
share.SetProperties();
// Now check the quota for the share. Call FetchAttributes() to populate the share's properties.
share.FetchAttributes();
Console.WriteLine("Current share quota: {0} GiB", share.Properties.Quota);
}
为文件或文件共享生成共享访问签名
从 Azure 文件存储客户端库的 5.x 版开始,可以为文件共享或单个文件生成共享访问签名 (SAS)。
还可以在文件共享上创建一个存储访问策略以管理共享访问签名。 我们建议创建一个存储访问策略,因为它可以在 SAS 泄密时让你撤销 SAS。 以下示例在共享上创建一个存储访问策略。 该示例使用该策略为共享中的文件提供 SAS 约束。
// Parse the connection string for the storage account.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
Microsoft.Azure.CloudConfigurationManager.GetSetting("StorageConnectionString"));
// Create a CloudFileClient object for credentialed access to Azure Files.
CloudFileClient fileClient = storageAccount.CreateCloudFileClient();
// Get a reference to the file share we created previously.
CloudFileShare share = fileClient.GetShareReference("logs");
// Ensure that the share exists.
if (share.Exists())
{
string policyName = "sampleSharePolicy" + DateTime.UtcNow.Ticks;
// Create a new stored access policy and define its constraints.
SharedAccessFilePolicy sharedPolicy = new SharedAccessFilePolicy()
{
SharedAccessExpiryTime = DateTime.UtcNow.AddHours(24),
Permissions = SharedAccessFilePermissions.Read | SharedAccessFilePermissions.Write
};
// Get existing permissions for the share.
FileSharePermissions permissions = share.GetPermissions();
// Add the stored access policy to the share's policies. Note that each policy must have a unique name.
permissions.SharedAccessPolicies.Add(policyName, sharedPolicy);
share.SetPermissions(permissions);
// Generate a SAS for a file in the share and associate this access policy with it.
CloudFileDirectory rootDir = share.GetRootDirectoryReference();
CloudFileDirectory sampleDir = rootDir.GetDirectoryReference("CustomLogs");
CloudFile file = sampleDir.GetFileReference("Log1.txt");
string sasToken = file.GetSharedAccessSignature(null, policyName);
Uri fileSasUri = new Uri(file.StorageUri.PrimaryUri.ToString() + sasToken);
// Create a new CloudFile object from the SAS, and write some text to the file.
CloudFile fileSas = new CloudFile(fileSasUri);
fileSas.UploadText("This write operation is authorized via SAS.");
Console.WriteLine(fileSas.DownloadText());
}
复制文件
从 Azure 文件存储客户端库的 5.x 版开始,可以将一个文件复制到另一个文件,将一个文件复制到一个 Blob,或将一个 Blob 复制到一个文件。
还可以使用 AzCopy 将一个文件复制到另一个文件或将一个 Blob 复制到一个文件,反之亦然。 请参阅 AzCopy 入门。
注意
如果将一个 Blob 复制到一个文件,或将一个文件复制到一个 Blob,必须使用共享访问签名 (SAS) 授予对源对象的访问权限,即使是在同一存储帐户内进行复制。
将一个文件复制到另一个文件
以下示例将一个文件复制到同一共享中的另一个文件。 可以使用共享密钥身份验证执行复制,因为此操作在同一存储帐户内复制文件。
// Parse the connection string for the storage account.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
Microsoft.Azure.CloudConfigurationManager.GetSetting("StorageConnectionString"));
// Create a CloudFileClient object for credentialed access to Azure Files.
CloudFileClient fileClient = storageAccount.CreateCloudFileClient();
// Get a reference to the file share we created previously.
CloudFileShare share = fileClient.GetShareReference("logs");
// 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("CustomLogs");
// Ensure that the directory exists.
if (sampleDir.Exists())
{
// Get a reference to the file we created previously.
CloudFile sourceFile = sampleDir.GetFileReference("Log1.txt");
// Ensure that the source file exists.
if (sourceFile.Exists())
{
// Get a reference to the destination file.
CloudFile destFile = sampleDir.GetFileReference("Log1Copy.txt");
// Start the copy operation.
destFile.StartCopy(sourceFile);
// Write the contents of the destination file to the console window.
Console.WriteLine(destFile.DownloadText());
}
}
}
将文件复制到 Blob
以下示例创建一个文件并将其复制到同一存储帐户中的某个 blob。 该示例为源文件创建一个 SAS,服务在复制操作期间使用该 SAS 授予对源文件的访问权限。
// Parse the connection string for the storage account.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
Microsoft.Azure.CloudConfigurationManager.GetSetting("StorageConnectionString"));
// Create a CloudFileClient object for credentialed access to Azure Files.
CloudFileClient fileClient = storageAccount.CreateCloudFileClient();
// Create a new file share, if it does not already exist.
CloudFileShare share = fileClient.GetShareReference("sample-share");
share.CreateIfNotExists();
// Create a new file in the root directory.
CloudFile sourceFile = share.GetRootDirectoryReference().GetFileReference("sample-file.txt");
sourceFile.UploadText("A sample file in the root directory.");
// Get a reference to the blob to which the file will be copied.
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = blobClient.GetContainerReference("sample-container");
container.CreateIfNotExists();
CloudBlockBlob destBlob = container.GetBlockBlobReference("sample-blob.txt");
// Create a SAS for the file that's valid for 24 hours.
// Note that when you are copying a file to a blob, or a blob to a file, you must use a SAS
// to authorize access to the source object, even if you are copying within the same
// storage account.
string fileSas = sourceFile.GetSharedAccessSignature(new SharedAccessFilePolicy()
{
// Only read permissions are required for the source file.
Permissions = SharedAccessFilePermissions.Read,
SharedAccessExpiryTime = DateTime.UtcNow.AddHours(24)
});
// Construct the URI to the source file, including the SAS token.
Uri fileSasUri = new Uri(sourceFile.StorageUri.PrimaryUri.ToString() + fileSas);
// Copy the file to the blob.
destBlob.StartCopy(fileSasUri);
// Write the contents of the file to the console window.
Console.WriteLine("Source file contents: {0}", sourceFile.DownloadText());
Console.WriteLine("Destination blob contents: {0}", destBlob.DownloadText());
可以用相同的方式将一个 Blob 复制到一个文件。 如果源对象是一个 Blob,则创建一个 SAS,以便在复制操作期间授予对该 Blob 的访问权限。
共享快照
从 Azure 文件存储客户端库的 8.5 版开始,可以创建共享快照。 还可以列出或浏览共享快照,以及删除共享快照。 创建后,共享快照是只读的。
创建共享快照
下面的示例可创建文件共享快照:
storageAccount = CloudStorageAccount.Parse(ConnectionString);
fClient = storageAccount.CreateCloudFileClient();
string baseShareName = "myazurefileshare";
CloudFileShare myShare = fClient.GetShareReference(baseShareName);
var snapshotShare = myShare.Snapshot();
列出共享快照
以下示例列出了共享上的快照:
var shares = fClient.ListShares(baseShareName, ShareListingDetails.All);
列出共享快照中的文件和目录
以下示例可浏览共享快照中的文件和目录:
CloudFileShare mySnapshot = fClient.GetShareReference(baseShareName, snapshotTime);
var rootDirectory = mySnapshot.GetRootDirectoryReference();
var items = rootDirectory.ListFilesAndDirectories();
从共享快照还原文件共享或文件
创建文件共享的快照即可恢复各个文件或整个文件共享。
查询文件共享的共享快照即可从文件共享快照还原文件。 然后,可以检索属于特定共享快照的文件。 使用该版本直接读取或还原文件。
CloudFileShare liveShare = fClient.GetShareReference(baseShareName);
var rootDirOfliveShare = liveShare.GetRootDirectoryReference();
var dirInliveShare = rootDirOfliveShare.GetDirectoryReference(dirName);
var fileInliveShare = dirInliveShare.GetFileReference(fileName);
CloudFileShare snapshot = fClient.GetShareReference(baseShareName, snapshotTime);
var rootDirOfSnapshot = snapshot.GetRootDirectoryReference();
var dirInSnapshot = rootDirOfSnapshot.GetDirectoryReference(dirName);
var fileInSnapshot = dir1InSnapshot.GetFileReference(fileName);
string sasContainerToken = string.Empty;
SharedAccessFilePolicy sasConstraints = new SharedAccessFilePolicy();
sasConstraints.SharedAccessExpiryTime = DateTime.UtcNow.AddHours(24);
sasConstraints.Permissions = SharedAccessFilePermissions.Read;
//Generate the shared access signature on the container, setting the constraints directly on the signature.
sasContainerToken = fileInSnapshot.GetSharedAccessSignature(sasConstraints);
string sourceUri = (fileInSnapshot.Uri.ToString() + sasContainerToken + "&" + fileInSnapshot.SnapshotTime.ToString()); ;
fileInliveShare.StartCopyAsync(new Uri(sourceUri));
删除共享快照
下面的示例删除了文件共享快照:
CloudFileShare mySnapshot = fClient.GetShareReference(baseShareName, snapshotTime); mySnapshot.Delete(null, null, null);
使用指标排查 Azure 文件存储问题
Azure 存储分析支持用于 Azure 文件存储的指标。 使用指标数据,可以跟踪请求和诊断问题。
可以通过 Azure 门户为 Azure 文件存储启用指标。 还可以通过 REST API 或 Azure 文件存储客户端库中的类似功能之一调用设置文件服务属性操作,以编程方式启用指标。
以下代码示例演示了如何使用 .NET 客户端库启用 Azure 文件存储的指标。
首先,将以下 using
指令以及前面添加的指令添加到 Program.cs 文件中:
using Microsoft.Azure.Storage.File.Protocol;
using Microsoft.Azure.Storage.Shared.Protocol;
尽管 Azure Blob、Azure 表和 Azure 队列使用 Microsoft.Azure.Storage.Shared.Protocol
命名空间中的共享 ServiceProperties
类型,但 Azure 文件存储使用其自身的类型,即 Microsoft.Azure.Storage.File.Protocol
命名空间中的 FileServiceProperties
类型。 但是,必须在代码中引用这两个命名空间才能编译后续代码。
// Parse your storage connection string from your application's configuration file.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
Microsoft.Azure.CloudConfigurationManager.GetSetting("StorageConnectionString"));
// Create the File service client.
CloudFileClient fileClient = storageAccount.CreateCloudFileClient();
// Set metrics properties for File service.
// Note that the File service currently uses its own service properties type,
// available in the Microsoft.Azure.Storage.File.Protocol namespace.
fileClient.SetServiceProperties(new FileServiceProperties()
{
// Set hour metrics
HourMetrics = new MetricsProperties()
{
MetricsLevel = MetricsLevel.ServiceAndApi,
RetentionDays = 14,
Version = "1.0"
},
// Set minute metrics
MinuteMetrics = new MetricsProperties()
{
MetricsLevel = MetricsLevel.ServiceAndApi,
RetentionDays = 7,
Version = "1.0"
}
});
// Read the metrics properties we just set.
FileServiceProperties serviceProperties = fileClient.GetServiceProperties();
Console.WriteLine("Hour metrics:");
Console.WriteLine(serviceProperties.HourMetrics.MetricsLevel);
Console.WriteLine(serviceProperties.HourMetrics.RetentionDays);
Console.WriteLine(serviceProperties.HourMetrics.Version);
Console.WriteLine();
Console.WriteLine("Minute metrics:");
Console.WriteLine(serviceProperties.MinuteMetrics.MetricsLevel);
Console.WriteLine(serviceProperties.MinuteMetrics.RetentionDays);
Console.WriteLine(serviceProperties.MinuteMetrics.Version);