Azure Storage 是微軟 Azure 雲提供的雲端存儲解決方案,當前支持的存儲類型有 Blob、Queue、File 和 Table。
筆者在《Azure Blob Storage 基本用法》中介紹了 Blob Storage 的基本用法,本文將介紹 File Storage 的主要使用方法。
File Storage 是什么?
Azure File Storage 是一個通過 Server Message Block (SMB) 協議提供雲端文件共享的服務。通過 File Storage 共享的文件,能夠被加載為雲端或本地主機的磁盤,應用程序可以通過文件 API 像訪問本地文件一樣訪問這些文件。
下面是 File Storage 典型的應用場景:
- 輕松遷移那些有磁盤讀寫操作的應用到雲端。不用修改程序,只要通過 File Storage 加載相應的文件即可。
- 存放共享的應用程序配置文件。
- 存放日志等應用程序診斷數據。
- 存放管理員的常用工具。
Azure File Storage的結構
下圖描述了 File Storage 的基本組織結構:
- Azure Storage Account:
Storage Account 是用來管理 Azure Storage 的一個命名空間,主要用來控制存儲數據的訪問權限和計費。對 Blob、Queue、File 和 Table 這些 Azure 提供的存儲服務的訪問控制,都是通過 Storage Account 來進行的,所以要想使用 File Storage,需要先創建你的 Storage Account。
- Share:
Share 是管理共享文件的單位,任何要共享的文件和目錄都必須屬於某個 Share。一個 Storage Account 下的 Share 數量是不受限制的,每個 Share 中可以存放任何數量的文件。但是每個 Share 中最多能存放5TB 的數據。
- Directory:
與 Blob Storage 不同,File Storage 支持真正的文件目錄。你可以根據需要來創建目錄。
- File:
File 是真正被共享的文件,每個文件最大 1TB。
- URL format:
與 Blob Storage 相似,File Storage 中的每個文件都可以通過 URL 來訪問。URL 的詳細格式為:
https://<storage account>.file.core.windows.net/<share>/<directory/directories>/<filename>
下面是個更真實的例子:
https://nickdemo.file.core.windows.net/demofiles/temp.txt
如果您還不熟悉 Azure Storage Account 的使用,以及如何通過 WindowsAzure.Storage 庫訪問 Azure Storage,請參考前文《Azure Table storage 基本用法》中的介紹,這里就不重復了。
為了方便查看 C# 代碼執行的結果,本文使用了 MS 發布的一個 Azure Storage 客戶端工具:Microsoft Azure Storage Explorer,文中簡稱為 Storage Explorer。下面是 File Storage 的一個截圖:
接下來我們通過 C# 代碼來介紹如何操作 File Storage。
創建 File Share
第一步我們先創建名為“mylogs”的 Share:
//CloudStorageAccount 類表示一個 Azure Storage Account,我們需要先創建它的實例,才能訪問屬於它的資源。 //注意連接字符串中的xxx和yyy,分別對應Access keys中的Storage account name 和 key。 CloudStorageAccount storageAccount = CloudStorageAccount.Parse("DefaultEndpointsProtocol=https;AccountName=xxx;AccountKey=yyy"); //CloudFileClient 類是 Windows Azure File Service 客戶端的邏輯表示,我們需要使用它來配置和執行對 File Storage 的操作。 CloudFileClient fileClient = storageAccount.CreateCloudFileClient(); //CloudFileShare 表示一個 File Share 對象。 CloudFileShare share = fileClient.GetShareReference(shareName); //如果不存在就創建 File Share。 share.CreateIfNotExists();
運行上面的代碼,然后打開 Storage Explorer,看到名為 ”mylogs” 的 Share 已經創建了:
上傳文件
File Storage 支持真正的文件目錄。所以在上傳文件前需要確定要把文件上傳到哪個目錄下。每一個 File Share 都有一個根目錄,我們可以先取到這個根目錄,然后再創建子目錄或是直接上傳文件。下面的代碼會在根目錄下創建一個叫 “web”的子目錄,然后上傳文件 web.log 到 web 目錄中:
//獲得根目錄的引用。 CloudFileDirectory rootDir = share.GetRootDirectoryReference(); //創建子目錄 "web" 的引用。 CloudFileDirectory webDir = rootDir.GetDirectoryReference("web"); //創建子目錄 "web"。 webDir.CreateIfNotExists(); //創建文件 "web.log" 的引用。 CloudFile cloudFile = webDir.GetFileReference("web.log"); string localFile = @"F:\temp\web.log"; using (var fileStream = System.IO.File.OpenRead(localFile)) { //上傳文件。 cloudFile.UploadFromStream(fileStream); }
在Storage Explorer 中檢查下結果:
復制文件
Azure Storage 支持在 Blob Storage 和 File Storage 之間相互復制文件,但這樣的操作涉及的訪問權限管理相對復雜一些。本文僅介紹文件在同一個 File Storage 中的復制操作。下面的代碼復制 web.log 文件並創建 web.copy.log 文件:
CloudFileShare share = GetFileShare(_currentShareName); CloudFileDirectory rootDir = share.GetRootDirectoryReference(); CloudFileDirectory webDir = rootDir.GetDirectoryReference("web"); CloudFile cloudFile = webDir.GetFileReference("web.log"); if (cloudFile.Exists()) { //由 web.log 文件創建 web.copy.log 文件。 CloudFile copyFile = webDir.GetFileReference("web.copy.log"); copyFile.StartCopy(cloudFile); }
查看復制操作的結果:
設置 Share 的最大容量
前面我們提到每個 Share 中最多能存放5TB 的數據。但有時可能需要限制一下它的最大值,比如最多只能存放1TB 的數據:
//指定最大容量為 1024,單位是GB。 share.Properties.Quota = 1024; share.SetProperties();
代碼很簡單,如果想要查看 Share 的最大容量是多少,直接取share.Properties.Quota 屬性的值就可以了。
現在我們在雲端有一個 1TB 大小的共享目錄,如何使用呢?
把 Share 映射為本地機器的網絡硬盤
用管理員權限啟動 cmd.exe,執行下面的命令:
cmdkey /add:<storage-account-name>.file.core.windows.net /user:<storage-account-name> /pass:<storage-account-key>
net use z: \\<storage-account-name>.file.core.windows.net\mylogs
注意,請把上面命令中的 < storage-account-name > 和 < storage-account-key >進行替換。
再用非管理員權限啟動 cmd.exe,再執行一次net use 命令:
net use z: \\<storage-account-name>.file.core.windows.net\mylogs
如果不第二次執行 net use 命令,資源管理器中是看不到驅動器盤符的:
注意:一定要在防火牆 Outbound 規則中放行 SMB 協議使用的 TCP 445端口。
這就搞定了!看起來還不錯吧?
總結
雖然我們看到File Storage 和前文中介紹的Blob Storage 存在着很多相似的地方,但本質上它們是不一樣的。Blob Storage 本質上是一個個網絡上的文件,而 File Storage 則是通過 SMB 協議實現的網絡共享文件,能夠被操作系統映射成本地的磁盤是其最大特征。也只有這一點才能讓應用程序通過文件操作API,完成對遠程文件的訪問。
相關閱讀:
Azure Blob Storage 基本用法 -- Azure Storage 之 Blob
Azure Queue Storage 基本用法 -- Azure Storage 之 Queue
Azure Table storage 基本用法 -- Azure Storage 之 Table