Azure File Storage 基本用法 -- Azure Storage 之 File

Azure Storage 是微軟 Azure 云提供的云端存儲(chǔ)解決方案,當(dāng)前支持的存儲(chǔ)類型有 Blob、Queue、File 和 Table。

筆者在《Azure Blob Storage 基本用法》中介紹了 Blob Storage 的基本用法,本文將介紹 File Storage 的主要使用方法。

File Storage 是什么?

Azure File Storage 是一個(gè)通過(guò) Server Message Block (SMB) 協(xié)議提供云端文件共享的服務(wù)。通過(guò) File Storage 共享的文件,能夠被加載為云端或本地主機(jī)的磁盤,應(yīng)用程序可以通過(guò)文件 API 像訪問(wèn)本地文件一樣訪問(wèn)這些文件。

下面是 File Storage 典型的應(yīng)用場(chǎng)景:

  1. 輕松遷移那些有磁盤讀寫操作的應(yīng)用到云端。不用修改程序,只要通過(guò) File Storage 加載相應(yīng)的文件即可。
  2. 存放共享的應(yīng)用程序配置文件。
  3. 存放日志等應(yīng)用程序診斷數(shù)據(jù)。
  4. 存放管理員的常用工具。

Azure File Storage的結(jié)構(gòu)

下圖描述了 File Storage 的基本組織結(jié)構(gòu):

  • Azure Storage Account:

Storage Account 是用來(lái)管理 Azure Storage 的一個(gè)命名空間,主要用來(lái)控制存儲(chǔ)數(shù)據(jù)的訪問(wèn)權(quán)限和計(jì)費(fèi)。對(duì) Blob、Queue、File 和 Table 這些 Azure 提供的存儲(chǔ)服務(wù)的訪問(wèn)控制,都是通過(guò) Storage Account 來(lái)進(jìn)行的,所以要想使用 File Storage,需要先創(chuàng)建你的 Storage Account。

  • Share:

Share 是管理共享文件的單位,任何要共享的文件和目錄都必須屬于某個(gè) Share。一個(gè) Storage Account 下的 Share 數(shù)量是不受限制的,每個(gè) Share 中可以存放任何數(shù)量的文件。但是每個(gè) Share 中最多能存放5TB 的數(shù)據(jù)。

  • Directory:

與 Blob Storage 不同,F(xiàn)ile Storage 支持真正的文件目錄。你可以根據(jù)需要來(lái)創(chuàng)建目錄。

  • File:

File 是真正被共享的文件,每個(gè)文件最大 1TB。

  • URL format:

與 Blob Storage 相似,F(xiàn)ile Storage 中的每個(gè)文件都可以通過(guò) URL 來(lái)訪問(wèn)。URL 的詳細(xì)格式為:

https://<storage account>.file.core.windows.net/<share>/<directory/directories>/<filename>

下面是個(gè)更真實(shí)的例子:

https://nickdemo.file.core.windows.net/demofiles/temp.txt

 

如果您還不熟悉 Azure Storage Account 的使用,以及如何通過(guò) WindowsAzure.Storage 庫(kù)訪問(wèn) Azure Storage,請(qǐng)參考前文《Azure Table storage 基本用法》中的介紹,這里就不重復(fù)了。

為了方便查看 C# 代碼執(zhí)行的結(jié)果,本文使用了 MS 發(fā)布的一個(gè) Azure Storage 客戶端工具:Microsoft Azure Storage Explorer,文中簡(jiǎn)稱為 Storage Explorer。下面是 File Storage 的一個(gè)截圖:

接下來(lái)我們通過(guò) C# 代碼來(lái)介紹如何操作 File Storage。

創(chuàng)建 File Share

第一步我們先創(chuàng)建名為“mylogs”的 Share:

復(fù)制代碼
//CloudStorageAccount 類表示一個(gè) Azure Storage Account,我們需要先創(chuàng)建它的實(shí)例,才能訪問(wèn)屬于它的資源。 //注意連接字符串中的xxx和yyy,分別對(duì)應(yīng)Access keys中的Storage account name 和 key。 CloudStorageAccount storageAccount = CloudStorageAccount.Parse("DefaultEndpointsProtocol=https;AccountName=xxx;AccountKey=yyy"); //CloudFileClient 類是 Windows Azure File Service 客戶端的邏輯表示,我們需要使用它來(lái)配置和執(zhí)行對(duì) File Storage 的操作。 CloudFileClient fileClient = storageAccount.CreateCloudFileClient(); //CloudFileShare 表示一個(gè) File Share 對(duì)象。 CloudFileShare share = fileClient.GetShareReference(shareName); //如果不存在就創(chuàng)建 File Share。 share.CreateIfNotExists();
復(fù)制代碼

運(yùn)行上面的代碼,然后打開 Storage Explorer,看到名為 ”mylogs” 的 Share 已經(jīng)創(chuàng)建了:

上傳文件

File Storage 支持真正的文件目錄。所以在上傳文件前需要確定要把文件上傳到哪個(gè)目錄下。每一個(gè) File Share 都有一個(gè)根目錄,我們可以先取到這個(gè)根目錄,然后再創(chuàng)建子目錄或是直接上傳文件。下面的代碼會(huì)在根目錄下創(chuàng)建一個(gè)叫 “web”的子目錄,然后上傳文件 web.log 到 web 目錄中:

復(fù)制代碼
//獲得根目錄的引用。 CloudFileDirectory rootDir = share.GetRootDirectoryReference(); //創(chuàng)建子目錄 "web" 的引用。 CloudFileDirectory webDir = rootDir.GetDirectoryReference("web"); //創(chuàng)建子目錄 "web"。 webDir.CreateIfNotExists(); //創(chuàng)建文件 "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);
}
復(fù)制代碼

在Storage Explorer 中檢查下結(jié)果:

 

復(fù)制文件

Azure Storage 支持在 Blob Storage 和 File Storage 之間相互復(fù)制文件,但這樣的操作涉及的訪問(wèn)權(quán)限管理相對(duì)復(fù)雜一些。本文僅介紹文件在同一個(gè) File Storage 中的復(fù)制操作。下面的代碼復(fù)制 web.log 文件并創(chuàng)建 web.copy.log 文件:

復(fù)制代碼
CloudFileShare share = GetFileShare(_currentShareName);
CloudFileDirectory rootDir = share.GetRootDirectoryReference();
CloudFileDirectory webDir = rootDir.GetDirectoryReference("web");
CloudFile cloudFile = webDir.GetFileReference("web.log"); if (cloudFile.Exists())
{ //由 web.log 文件創(chuàng)建 web.copy.log 文件。 CloudFile copyFile = webDir.GetFileReference("web.copy.log");
    copyFile.StartCopy(cloudFile);
}
復(fù)制代碼

 查看復(fù)制操作的結(jié)果:

設(shè)置 Share 的最大容量

前面我們提到每個(gè) Share 中最多能存放5TB 的數(shù)據(jù)。但有時(shí)可能需要限制一下它的最大值,比如最多只能存放1TB 的數(shù)據(jù):

//指定最大容量為 1024,單位是GB。 share.Properties.Quota = 1024;
share.SetProperties();

代碼很簡(jiǎn)單,如果想要查看 Share 的最大容量是多少,直接取share.Properties.Quota 屬性的值就可以了。

 

現(xiàn)在我們?cè)谠贫擞幸粋€(gè) 1TB 大小的共享目錄,如何使用呢?

把 Share 映射為本地機(jī)器的網(wǎng)絡(luò)硬盤

用管理員權(quán)限啟動(dòng) cmd.exe,執(zhí)行下面的命令:

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

注意,請(qǐng)把上面命令中的 < storage-account-name > 和 < storage-account-key >進(jìn)行替換。

再用非管理員權(quán)限啟動(dòng) cmd.exe,再執(zhí)行一次net use 命令:

net use z: \\<storage-account-name>.file.core.windows.net\mylogs

如果不第二次執(zhí)行 net use 命令,資源管理器中是看不到驅(qū)動(dòng)器盤符的:

注意:一定要在防火墻 Outbound 規(guī)則中放行 SMB 協(xié)議使用的 TCP 445端口。

這就搞定了!看起來(lái)還不錯(cuò)吧?

總結(jié)

雖然我們看到File Storage 和前文中介紹的Blob Storage 存在著很多相似的地方,但本質(zhì)上它們是不一樣的。Blob Storage 本質(zhì)上是一個(gè)個(gè)網(wǎng)絡(luò)上的文件,而 File Storage 則是通過(guò) SMB 協(xié)議實(shí)現(xiàn)的網(wǎng)絡(luò)共享文件,能夠被操作系統(tǒng)映射成本地的磁盤是其最大特征。也只有這一點(diǎn)才能讓應(yīng)用程序通過(guò)文件操作API,完成對(duì)遠(yuǎn)程文件的訪問(wèn)。