Azure 基础:File Storage

简介:

Azure Storage 是微软 Azure 云提供的云端存储解决方案,当前支持的存储类型有 Blob、Queue、File 和 Table。

笔者在前文中介绍了 Blob Storage 的基本用法,本文将介绍 File Storage 的主要使用方法。

File Storage 是什么?

Azure File Storage 是一个通过 Server Message Block (SMB) 协议提供云端文件共享的服务。通过 File Storage 共享的文件能够被加载为云端或本地主机的磁盘,应用程序可以通过文件 API 像访问本地文件一样访问这些文件。

下面是 File Storage 典型的应用场景:
1.    轻松迁移那些有磁盘读写操作的应用到云端。不用修改程序,只要通过 File Storage 加载相应的文件即可。
2.    存放共享的应用程序配置文件。
3.    存放日志等应用程序诊断数据。
4.    存放管理员的常用工具。

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 完成对远程文件的访问。


本文转自sparkdev博客园博客,原文链接:http://www.cnblogs.com/sparkdev/p/6501297.html,如需转载请自行联系原作者

相关文章
|
7月前
|
消息中间件 人工智能 弹性计算
《文档智能 & RAG让AI大模型更懂业务》解决方案评测
一文带你了解《文档智能 & RAG让AI大模型更懂业务》解决方案的优与劣
221 13
Gbit与GByte比较
这段在看阿里的ECS指标,发现网络带宽的相关指标为Gbit/s,与平常的单位有些不同。先解释下差异并记录。
3604 0
Gbit与GByte比较
|
1月前
|
人工智能 自然语言处理 安全
学不会编程也能写测试?AI让测试更平权
在传统的软件开发体系中,测试常被划分为“技术型测试”(如自动化、性能、安全)和“业务型测试”(如功能验证、用户体验)。前者掌握技术话语权,后者则更多依赖经验和流程规范。然而,随着大语言模型(LLM)等AI技术的迅猛发展,这一固有格局正被悄然打破:
91 10
|
26天前
|
Web App开发 数据采集 JavaScript
动态网页爬取:Python如何获取JS加载的数据?
动态网页爬取:Python如何获取JS加载的数据?
320 58
|
29天前
|
弹性计算 Ubuntu Linux
阿里云服务器镜像怎么选?公共/自定义/共享/云市场/社区镜像区别与适用场景梳理
在购买阿里云服务器的过程中,选择合适的镜像(即云服务器的操作系统)是至关重要的一步。阿里云服务器镜像涵盖了公共镜像、自定义镜像、共享镜像、云市场镜像(镜像市场)和社区镜像等多种类型,对于新手用户来说,面对这些不同类型的镜像,往往会感到困惑,不知道它们之间的区别,更不知道如何根据自身需求进行选择。本文为大家解析这些镜像的特点、区别,并为大家提供选择参考。
318 60
|
3月前
|
人工智能 API 语音技术
EmotiVoice:网易开源AI语音合成黑科技,2000+音色情感可控
EmotiVoice是网易有道开源的多语言语音合成系统,支持中英文2000多种音色,通过提示词控制情感输出,提供Web界面和API接口,具备语音克隆等先进功能。
266 43
EmotiVoice:网易开源AI语音合成黑科技,2000+音色情感可控
|
4月前
|
机器学习/深度学习 运维 数据可视化
《生成对抗网络:网络安全态势感知可视化的新引擎》
在数字化时代,网络安全至关重要。网络安全态势感知可视化通过直观展示网络状况,帮助快速发现威胁。生成对抗网络(GANs)作为前沿AI技术,正为这一领域带来变革。GANs由生成器和判别器组成,通过对抗训练生成逼真数据,用于数据增强、异常检测、威胁情报合成及动态场景模拟。尽管面临数据隐私、模型稳定性和可解释性等挑战,GANs的应用前景广阔,有望大幅提升网络安全水平。
166 22
|
9月前
|
存储 Kubernetes 应用服务中间件
Ingress-Nginx使用指南上篇
关于Ingress-Nginx在Kubernetes中的使用指南,涵盖了从基础安装到高级特性配置的详细步骤和实战案例。
2894 3
Ingress-Nginx使用指南上篇
|
10月前
|
监控 Ubuntu Docker
如何在Docker容器启动时自动运行脚本
【8月更文挑战第13天】在Docker容器启动时自动运行脚本可通过以下方式实现:1) 使用`ENTRYPOINT`或`CMD`指令在Dockerfile中直接指定启动脚本,如`ENTRYPOINT [&quot;/startup.sh&quot;]`;2) 启动容器时通过`--entrypoint`参数指定脚本路径;3) 利用supervisor等进程管理工具自动启动与监控脚本,确保其稳定运行。确保脚本具有执行权限并正确设置依赖资源路径。
2264 1
|
Java 应用服务中间件
解决启动tomcat出现的The JRE_HOME environment variable is not defined correctly问题~
解决启动tomcat出现的The JRE_HOME environment variable is not defined correctly问题~
853 0