In my previous post, I discussed the new Azure Files preview, what it entailed, and what you can do with it, as well as how to sign up for the preview. Don’t forget that you also need to create a new storage account in order to get the Azure Files endpoint.
Unfortunately, there is no UI available yet to let you manage and look at your shares. I use Cerebrata’s Azure Management Studio to access my storage tables, queues, and blobs, and I expect them to have a new version supporting Azure Files before too long. In the meantime, you have multiple options: write some code and use the REST APIs, use PowerShell, RDP into your VMs and attach the share, or write a program using the Storage Client Library. In this post, I will show you how to use the PowerShell cmdlets to create your file share, upload files to it, list the files on it, etc.
Setting up the PowerShell cmdlets for the Azure Files preview
First, you need to download the PowerShell cmdlets for this preview. At the time of this writing, they can be found here. Download the zip file and save it to your local computer. Depending on your OS and security settings, you might need to unblock the zip file before you can access it. To do this, right-click on the file and check the properties; if there is an Unblock button, just click on it to unblock the file.
These Azure File cmdlets use Storage Client Library 4.0, so you need to run them in a different PowerShell session than the regular cmdlets. You need to unzip them, run PowerShell, and then set your default directory to the unzipped files. So you might want to think about that before unzipping the files, and put them in an easy-to-type location. For example, I’m going to put mine in a folder on the root of the data drive in my computer instead of MyDocuments. So I’ve created a folder called D:\zAzureFiles\ (so it shows up at the bottom of the directory listing), and unzipped the zip file into that folder. (If you don’t have a D drive, just create a folder on your C drive and use that).
When you have the files unzipped, run either Windows PowerShell or Windows Azure PowerShell. Change directories to the AzureStorageFile directory created when you unzipped the zip file.
If you do a DIR at this point, it will show you the files in the directory. What you want to do is load the Azure Files cmdlets. Here is the what the command looks like:
> import-module .\AzureStorageFile.psd1
When I type this into the Windows Azure PowerShell window, I get the list of cmdlets that were loaded.
Now that you have PowerShell up and running with the new cmdlets, you can fully manage your share(s).
Using the PowerShell cmdlets
The first thing you need to do is create a context that specifies the credentials for the storage account you want to use for your share. This is what the command looks like; you’ll want to make the appropriate substitutions.
> $ctx = New-AzureStorageContext [storageaccountname] [storageaccountkey]
Nobody in their right mind wants to type in their storage account key, so you’ll want to paste this. In case you’re a newbie at PowerShell, I will tell you that the PowerShell window is similar to a Command Window. After copying it into the Windows clipboard, you can right-click on the line in the PowerShell window where you want it to go, and it will paste it automatically (I didn’t even have to right-click and select Paste, I just right-clicked and it pasted it.)
I have a Surface Pro tablet, and when trying this, I had all kinds of trouble. I could not right-click and get it to paste with the Pen, the Touchpad, or using my finger (not even the middle one ). So here’s a free tip for those of you trying the same thing: Copy the string into the Windows clipboard, then select the PowerShell window, click Alt+Space. This will bring up a menu where you can type E for edit, and P for paste.
(This doesn’t seem like a big deal unless you create a demo on your desktop computer for a talk that you’re giving using your Surface Pro, and you don’t actually test the demo on the Surface Pro until midnight the night before the talk, and then you find that you can’t get it to do something simple like paste a big-ass string into a window. Not that I would ever do anything like that. *cough*. But I digress.)
Here’s my command creating the context in PowerShell, using my storage account called nightbirdstorage3 with my storage account key truncated so you can’t access my storage account and store your vacation pictures for free:
Now that you have the context set, you can create a file share in that storage account like this:
> $s = New-AzureStorageShare [sharename] –Context $ctx
I’m going to create a share called nightbird in my storage account:
Ta-dah! I now have a file share called nightbird in my nightbirdstorage3 storage account.
So how do you upload files onto your share? Using this command, you can upload one file to the share you’ve set as $s.
> Set-AzureStorageFileContent –Share $s –Source [local path to the file]
I’ll upload several images from the D:\zAzureFiles folder. Notice that on the last one, I’ve already uploaded that file, so it gives me an error message. You can use the –Force switch to tell it to overwrite the file if it already exists – just add it to the end of the command.
What if you don’t want them in the root folder of the share, but in a subfolder? You can create a directory on the share, and then specify that directory when uploading the files. To create a directory (where $s is the share):
> New-AzureStorageDirectory –Share $s –Path [foldername]
Then when you upload the file, you specify the path ($s is the share):
> Set-AzureStorageFileContent –Share $s –Source [path to local file] –Path [foldername]
I’ll create a directory called Images, and upload some files into it:
How do I see what is on my share? Here’s the command for that, followed by an example.
This gets the files in the root.
This gets the files in the specified folder.
Get-AzureStorageFile $s –Path [foldername]
Here is it in action:
Note in the first listing, which is the root, it shows both the Images folder and the files in the root directory. For the second command, it shows what is in the Images folder. There are no subfolders in the Images folder; if there were, it would show them in the listing.
Deleting a file from the share
These are very similar to the commands above. To delete a file, use Remove-AzureStorageFile instead of Set-AzureStorageFileContent (where $s is the share).
> Remove-AzureStorageFile –Share $s –Path [foldername]/[filename]
To remove a directory, use Remove-AzureStorageDirectory:
> Remove-AzureStorageDirectory –Share $s –Path Images
Note that the directory must be empty before you can delete it. Right now, they don’t have a way to delete a directory and all the files in it recursively like Directory.Delete(path, true) in .NET.
Downloading a file from the share to your local computer
To download a file from the share to the local computer, use Get-AzureStorageFileContent.
> Get-AzureStorageFileContent –Share $s –Path [path to file on the share] [path on local computer]
Here’s an example of downloading shark.jpg from the Images folder on the share into my local directory:
If the file already exists locally, it will give you an error. You can use the –Force switch to overwrite it if it already exists – just add it to the end of the command.
Uploading/downloading multiple files with one command
What if you want to upload a bunch of files? You have to either specify them separately, or use AzCopy version 2.4. Download AzCopy, then run the install. Then go search the C:\ drive to find out where it put the dang files. I copied the whole folder over to my D:\zAzureFiles directory for easier use. Use a Command Window and set the directory to the AzCopy directory. Then you can run AzCopy by typing in a command. Because of the likelihood that I’m not going to get it right the first time, I create a text file with the command in it, and save it as a .cmd file and execute it. Or copy the command from the text file and paste it into the command window and execute it. This makes it easier to edit, copy, and paste repeatedly when all you have to change is a directory, or to fix it if you have a problem.
Here are some examples of what you can do with this.
Upload all the files in a directory (designated by [localpath]) to the specified storage account and share name. The /s switch tells it to upload the directory recursively, which means it picks up the files in that directory, and all subdirectories and files under that original directory, retaining the directory structure.
AzCopy [localpath] https://[storageaccount].file.core.windows.net/[sharename]
Here’s my example:
To make sure this worked, I’ll go back to PowerShell to pull a list of files in the directory and see if my new files are there.
You can see that there are two new files on the share – greatwhiteshark.jpg and macworld_bing.jpg – those came from my test directory.
Here’s how to upload files using a wild card. For example, you could upload all the jpg files.
AzCopy [localpath] https://[storageaccount].file.core.windows.net/[sharename] *.jpg
Here’s how to download the files from the file share to your local computer. This will download all of the files on the file share, including all subdirectories and the files in them.
AzCopy https://[storageaccount].file.core.windows.net/[sharename] [localpath]
You can also copy just one file. This does not look recursively through the directories; it only looks in the one you specify.
AzCopy https://[storageaccount].file.core.windows.net/[sharename]/foldername [localpath]
/DestKey:[StorageAccountKey] /s [name of the file you want to download]
Note: It will not retain empty folders. So if you upload a directory structure that has an empty folder in it somewhere, that folder will not appear on the target. The same applies when download a directory structure.
In this post, I showed you how to obtain the PowerShell cmdlets for the Azure Files preview, and how to use them to manage your share and transfer files to/from your share. In my next post, I’ll show you how to create a VM, RDP into it, attach the file share, and access the files.