title | description | author | ms.service | ms.devlang | ms.topic | ms.date | ms.author | ms.subservice | ms.custom |
---|---|---|---|---|---|---|---|---|---|
Develop for Azure Files with .NET | Microsoft Docs |
Learn how to develop .NET applications and services that use Azure Files to store data. |
roygara |
storage |
dotnet |
conceptual |
10/02/2020 |
rogarana |
files |
devx-track-csharp |
[!INCLUDE storage-selector-file-include]
Learn the basics of developing .NET applications that use Azure Files to store data. This article shows how to create a simple console application to do the following with .NET and Azure Files:
- Get the contents of a file.
- Set the maximum size, or quota, for a file share.
- Create a shared access signature (SAS) for a file.
- Copy a file to another file in the same storage account.
- Copy a file to a blob in the same storage account.
- Create a snapshot of a file share.
- Restore a file from a share snapshot.
- Use Azure Storage Metrics for troubleshooting.
To learn more about Azure Files, see What is Azure Files?
[!INCLUDE storage-check-out-samples-dotnet]
Azure Files provides two broad approaches to client applications: Server Message Block (SMB) and REST. Within .NET, the System.IO
and Azure.Storage.Files.Shares
APIs abstract these approaches.
API | When to use | Notes |
---|---|---|
System.IO | Your application:
|
File I/O implemented with Azure Files over SMB is generally the same as I/O with any network file share or local storage device. For an introduction to a number of features in .NET, including file I/O, see the Console Application tutorial. |
Azure.Storage.Files.Shares | Your application:
|
This article demonstrates the use of Azure.Storage.Files.Shares for file I/O using REST instead of SMB and management of the file share. |
You can use the Azure Files client library in any type of .NET app. These apps include Azure cloud, web, desktop, and mobile apps. In this guide, we create a console application for simplicity.
In Visual Studio, create a new Windows console application. The following steps show you how to create a console application in Visual Studio 2019. The steps are similar in other versions of Visual Studio.
- Start Visual Studio and select Create a new project.
- In Create a new project, choose Console App (.NET Framework) for C#, and then select Next.
- In Configure your new project, enter a name for the app, and select Create.
Add all the code examples in this article to the Program
class in the Program.cs file.
Refer to these packages in your project:
- Azure core library for .NET: This package is the implementation of the Azure client pipeline.
- Azure Storage Blob client library for .NET: This package provides programmatic access to blob resources in your storage account.
- Azure Storage Files client library for .NET: This package provides programmatic access to file resources in your storage account.
- System Configuration Manager library for .NET: This package provides a class storing and retrieving values in a configuration file.
You can use NuGet to obtain the packages. Follow these steps:
-
In Solution Explorer, right-click your project and choose Manage NuGet Packages.
-
In NuGet Package Manager, select Browse. Then search for and choose Azure.Core, and then select Install.
This step installs the package and its dependencies.
-
Search for and install these packages:
- Azure.Storage.Blobs
- Azure.Storage.Files.Shares
- System.Configuration.ConfigurationManager
- Microsoft Azure Storage common library for .NET: This package provides programmatic access to common resources in your storage account.
- Microsoft Azure Storage Blob library for .NET: This package provides programmatic access to blob resources in your storage account.
- Microsoft Azure Storage File library for .NET: This package provides programmatic access to file resources in your storage account.
- Microsoft Azure Configuration Manager library for .NET: This package provides a class for parsing a connection string in a configuration file, wherever your application runs.
You can use NuGet to obtain the packages. Follow these steps:
-
In Solution Explorer, right-click your project and choose Manage NuGet Packages.
-
In NuGet Package Manager, select Browse. Then search for and choose Microsoft.Azure.Storage.Blob, and then select Install.
This step installs the package and its dependencies.
-
Search for and install these packages:
- Microsoft.Azure.Storage.Common
- Microsoft.Azure.Storage.File
- Microsoft.Azure.ConfigurationManager
Next, save your credentials in your project's App.config file. In Solution Explorer, double-click App.config
and edit the file so that it is similar to the following example.
Replace myaccount
with your storage account name and mykey
with your storage account key.
:::code language="xml" source="~/azure-storage-snippets/files/howto/dotnet/dotnet-v12/app.config" highlight="5,6,7":::
Replace myaccount
with your storage account name and StorageAccountKeyEndingIn==
with your storage account key.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<appSettings>
<add key="StorageConnectionString"
value="DefaultEndpointsProtocol=https;AccountName=myaccount;AccountKey=StorageAccountKeyEndingIn==" />
</appSettings>
</configuration>
Note
The Azurite storage emulator does not currently support Azure Files. Your connection string must target an Azure storage account in the cloud to work with Azure Files.
In Solution Explorer, open the Program.cs file, and add the following using directives to the top of the file.
:::code language="csharp" source="~/azure-storage-snippets/files/howto/dotnet/dotnet-v12/FileShare.cs" id="snippet_UsingStatements":::
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
[!INCLUDE storage-cloud-configuration-manager-include]
In the Program.cs file, add the following code to access the file share programmatically.
The following method creates a file share if doesn't already exist. The method starts by creating a ShareClient object from a connection string. The sample then attempts to download a file we created earlier. Call this method from Main()
.
:::code language="csharp" source="~/azure-storage-snippets/files/howto/dotnet/dotnet-v12/FileShare.cs" id="snippet_CreateShare":::
Next, add the following content to the Main()
method, after the code shown above, to retrieve the connection string. This code gets a reference to the file we created earlier and outputs its contents.
// 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);
}
}
}
Run the console application to see the output.
Beginning with version 5.x of the Azure Files client library, you can set the quota (maximum size) for a file share. You can also check to see how much data is currently stored on the share.
Setting the quota for a share limits the total size of the files stored on the share. If the total size of files on the share exceeds the quota, clients can't increase the size of existing files. Clients also can't create new files, unless those files are empty.
The example below shows how to check the current usage for a share and how to set the quota for the share.
:::code language="csharp" source="~/azure-storage-snippets/files/howto/dotnet/dotnet-v12/FileShare.cs" id="snippet_SetMaxShareSize":::
// 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} GB", stats.Usage.ToString());
// Specify the maximum size of the share, in GB.
// This line sets the quota to be 10 GB 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} GB", share.Properties.Quota);
}
Beginning with version 5.x of the Azure Files client library, you can generate a shared access signature (SAS) for a file share or for an individual file.
The following example method returns a SAS on a file in the specified share.
:::code language="csharp" source="~/azure-storage-snippets/files/howto/dotnet/dotnet-v12/FileShare.cs" id="snippet_GetFileSasUri":::
You can also create a stored access policy on a file share to manage shared access signatures. We recommend creating a stored access policy because it lets you revoke the SAS if it becomes compromised. The following example creates a stored access policy on a share. The example uses that policy to provide the constraints for a SAS on a file in the share.
// 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());
}
For more information about creating and using shared access signatures, see How a shared access signature works.
Beginning with version 5.x of the Azure Files client library, you can copy a file to another file, a file to a blob, or a blob to a file.
You can also use AzCopy to copy one file to another or to copy a blob to a file or the other way around. See Get started with AzCopy.
Note
If you are copying a blob to a file, or a file to a blob, you must use a shared access signature (SAS) to authorize access to the source object, even if you are copying within the same storage account.
The following example copies a file to another file in the same share. You can use Shared Key authentication to do the copy because this operation copies files within the same storage account.
:::code language="csharp" source="~/azure-storage-snippets/files/howto/dotnet/dotnet-v12/FileShare.cs" id="snippet_CopyFile":::
// 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());
}
}
}
The following example creates a file and copies it to a blob within the same storage account. The example creates a SAS for the source file, which the service uses to authorize access to the source file during the copy operation.
:::code language="csharp" source="~/azure-storage-snippets/files/howto/dotnet/dotnet-v12/FileShare.cs" id="snippet_CopyFileToBlob":::
// 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());
You can copy a blob to a file in the same way. If the source object is a blob, then create a SAS to authorize access to that blob during the copy operation.
Beginning with version 8.5 of the Azure Files client library, you can create a share snapshot. You can also list or browse share snapshots and delete share snapshots. Once created, share snapshots are read-only.
The following example creates a file share snapshot.
:::code language="csharp" source="~/azure-storage-snippets/files/howto/dotnet/dotnet-v12/FileShare.cs" id="snippet_CreateShareSnapshot":::
storageAccount = CloudStorageAccount.Parse(ConnectionString);
fClient = storageAccount.CreateCloudFileClient();
string baseShareName = "myazurefileshare";
CloudFileShare myShare = fClient.GetShareReference(baseShareName);
var snapshotShare = myShare.Snapshot();
The following example lists the snapshots on a share.
:::code language="csharp" source="~/azure-storage-snippets/files/howto/dotnet/dotnet-v12/FileShare.cs" id="snippet_ListShareSnapshots":::
var shares = fClient.ListShares(baseShareName, ShareListingDetails.All);
The following example browses files and directories within share snapshots.
:::code language="csharp" source="~/azure-storage-snippets/files/howto/dotnet/dotnet-v12/FileShare.cs" id="snippet_ListSnapshotContents":::
CloudFileShare mySnapshot = fClient.GetShareReference(baseShareName, snapshotTime);
var rootDirectory = mySnapshot.GetRootDirectoryReference();
var items = rootDirectory.ListFilesAndDirectories();
Taking a snapshot of a file share enables you to recover individual files or the entire file share.
You can restore a file from a file share snapshot by querying the share snapshots of a file share. You can then retrieve a file that belongs to a particular share snapshot. Use that version to directly read or to restore the file.
:::code language="csharp" source="~/azure-storage-snippets/files/howto/dotnet/dotnet-v12/FileShare.cs" id="snippet_RestoreFileFromSnapshot":::
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));
The following example deletes a file share snapshot.
:::code language="csharp" source="~/azure-storage-snippets/files/howto/dotnet/dotnet-v12/FileShare.cs" id="snippet_DeleteSnapshot":::
CloudFileShare mySnapshot = fClient.GetShareReference(baseShareName, snapshotTime); mySnapshot.Delete(null, null, null);
Azure Storage Analytics supports metrics for Azure Files. With metrics data, you can trace requests and diagnose issues.
You can enable metrics for Azure Files from the Azure portal. You can also enable metrics programmatically by calling the Set File Service Properties operation with the REST API or one of its analogs in the Azure Files client library.
The following code example shows how to use the .NET client library to enable metrics for Azure Files.
:::code language="csharp" source="~/azure-storage-snippets/files/howto/dotnet/dotnet-v12/FileShare.cs" id="snippet_UseMetrics":::
First, add the following using
directives to your Program.cs file, along with the ones you added above:
using Microsoft.Azure.Storage.File.Protocol;
using Microsoft.Azure.Storage.Shared.Protocol;
Although Azure Blobs, Azure Tables, and Azure Queues use the shared ServiceProperties
type in the Microsoft.Azure.Storage.Shared.Protocol
namespace, Azure Files uses its own type, the FileServiceProperties
type in the Microsoft.Azure.Storage.File.Protocol
namespace. You must reference both namespaces from your code, however, for the following code to compile.
// 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);
If you encounter any problems, you can refer to Troubleshoot Azure Files problems in Windows.
For more information about Azure Files, see the following resources: