在我们收到的请求中,有一个频繁出现的请求是提供一种能在 Windows Azure Blob 存储与其本地文件系统之间轻松上传或下载文件的方法。一年半前, 我们很高兴地发布了 AzCopy, Windows Azure 存储客户借助这款命令行实用程序就可以实现上述操作。该实用程序旨在简化数据传输任务,使您可以轻松将数据传入或传出 Windows Azure 存储帐户。客户可以将其作为独立工具使用,也可以把它添加到现有应用程序中。您可以随时从
aka.ms/AzCopy 下载最新版本。

此命令与您可能已经很熟悉的 robocopy 等其他 Microsoft 文件复制实用程序类似。以下是命令的语法:

AzCopy <Source> <Destination> [filepattern] [Options]

在本文中,我们将重点介绍 AzCopy 的功能,暂不讨论实施细节。帮助命令 (AzCopy /?) 列出了所有可用的系统命令和参数,并对其进行了简要说明。

主要功能:

  • 有效性和灵活性:借助 AzCopy,用户可以选择性地复制数据。使用递归模式时,客户可以复制文件的嵌套目录。用户可以指定文件模式(在 Windows 文件系统中使用通配符,在 Blob 存储中使用前缀)来识别等待复制的源文件。此外,用户也可以设置选项以复制设置了“存档”属性的文件。复制大量文件时,如果其中某个文件由于网络问题或其他问题而无法复制,重试选项可以从中断处(尚未复制的文件处)继续执行复制过程。使用重试模式,您无需再重新复制先前已成功复制的文件。
  • 支持 Windows Azure 存储数据类型:AzCopy 提供了相应的选项,可以让客户把存储帐户中的目标数据指定为 Block Blob 或 Page Blob。默认设置为 Block Blob,因为它几乎适用于所有文件。使用 Page Blob 选项时,会向 Blob 添加零,使其成为 512 个字节的边界。
  • 命名规则:URI 格式(http 或 https)用于指定 Blob 存储路径,而 NTFS Windows 文件文件夹路径则用于 Windows 文件系统。由于一些 Blob 名称无法直接转换到 Windows 文件系统, AzCopy 使用其自身的规则将其转换为 Windows 文件系统名称。下面介绍了一些在命名转换过程中遵循的规则:
    • 使用以下规则对与特殊 Windows 文件名称冲突的 Blob 进行重命名:“.” =>“dot”;“..”=>“dotdot”;“/” => “slash”等。与其他冲突解决方案规则一样,如果这些名称发生冲突,则向发生冲突的文件或 Blob 名称添加字符串“(n)”以解决冲突。
    • Windows 文件系统命名空间不区分大小写(但是会保留大小写),Windows Azure Blob 命名空间区分大小写,以下规则适用:
      • § Blob 命名空间中的 Blob 使用文件名的默认大小写创建。
      • § 文件使用 Blob 命名空间的默认大小写创建。
      • § 如果从 Blob 命名空间复制到文件命名空间时发生大小写冲突,将向发生冲突的文件或 Blob 名称添加字符串“(n)”。
  • 日志记录:用户可以在日志模式 (verbose) 下运行 AzCopy,这将显示经过处理的文件和目录的列表,并显示实用程序无法复制的文件的列表。在日志模式下运行时,AzCopy 还将在日志中显示每个文件的进度指示。

示例:

示例 1:在递归模式中,将可从本地访问的文件目录复制到 Blob 存储容器。

AzCopy C:\blob-data https://myaccount.blob.core.windows.net/mycontainer/
/destkey:key /S

上述命令将把“c:\blob-data”目录和所有子目录中的所有文件作为 Block Blob 复制到存储帐户“myaccount”中名为“mycontainer”的容器。“Blob-data”文件夹包含以下文件和一个名为“subfolder1”的子目录;

C:\blob-data\car1.docx

C:\blob-data\car2.docx

C:\blob-data\car3.docx

C:\blob-data\train1.docx

C:\blob-data\subfolder1\car_sub1.docx

C:\blob-data\subfolder1\car_sub2.docx

完成复制操作后,Blob 容器“mycontainer”中将包含以下 Blob:

car1.docx

car2.docx

car3.docx

train1.docx

subfolder1/car_sub1.docx

subfolder1/car_sub2.docx

如果不使用递归模式(执行复制时不使用“/S”选项),Blob 容器“mycontainer”将仅包含“blob-data”文件夹下的以下文件,并将忽略“subfolder1”文件夹下的文件。

car1.docx

car2.docx

car3.docx

train1.docx

示例 2:如果同时启用日志模式和递归模式,将从 Blob 存储中把一组 Blob 以递归方式复制到可从本地访问的目录。

AzCopy https://myaccount.blob.core.windows.net/mycontainer c:\blob-data /sourceKey:key /S /V

此命令会在日志模式和递归模式中将帐户“myaccount”的 Blob 容器“mycontainer”下的所有 Blob 复制到“c:\blob-data”目录。

Blob 容器“mycontainer”包含以下文件:

car1.docx

car2.docx

car3.docx

train1.docx

subfolder1/car_sub1.docx

subfolder1/car_sub2.docx

由于我们正在使用日志模式,此工具将打印以下输出到日志文件中,其中除了传输摘要外,还包含每个文件的文件传输状态。默认情况下,此工具仅显示传输摘要:

Finished Transfer: car1.docx

Finished Transfer: car2.docx

Finished Transfer: car3.docx

Finished Transfer: train1.docx

Finished Transfer: subfolder1/car_sub1.docx

Finished Transfer: subfolder1/car_sub2.docx

Transfer summary:

-----------------

Total files transferred: 6

Transfer successfully: 6

Transfer failed: 0

After the copy operation,

c:\blob-data folder will contain the files listed below:

C:\blob-data\car1.docx

C:\blob-data\car2.docx

C:\blob-data\car3.docx

C:\blob-data\train1.docx

C:\blob-data\subfolder1\car_sub1.docx

C:\blob-data\subfolder1\car_sub2.docx

下面我们来稍微尝试一下另一种略有不同的情况,即通过使用以下命令复制以“subfolder1\”开头的 Blob:

AzCopy https://myaccount.blob.core.windows.net/mycontainer/subfolder1
c:\blob-data /sourceKey:key /S /V

上述命令仅复制以“subfolder1/”开头的 Blob,因此工具仅将“subfolder1/car_sub1.docx”和“subfolder1/car_sub2.docx”Blob 复制到“c:\blob-data\”文件夹。执行复制操作后,“C:\blob-data”将包含以下文件:

C:\blob-data\car_sub1.docx

C:\blob-data\car_sub2.docx

示例 3:在重试模式中,将可从本地访问的文件目录复制到 Blob 帐户

AzCopy c:\blob-data https://myaccount.blob.core.windows.net/mycontainer
/destkey:key /Z:restart.log /S

Restart.log 是一个用于维护复制操作状态并记录在中断时重新启动操作的日志文件。如果没有指定日志文件和重试模式参数,日志文件将默认为%localAppData%中的“azcopy.log”。

例如,“C:\blob-data”文件夹包含五个大文件,每个文件的大小均超过 100 MB。

C:\blob-data\car.docx

C:\blob-data\car1.docx

C:\blob-data\car2.docx

C:\blob-data\car3.docx

C:\blob-data\car4.docx

使用重试选项运行时,借助 AzCopy,可以在发生故障的情况下重新启动复制过程。如果复制“car.docx”时发生故障,AzCopy 会从“car.docx”尚未复制的部分继续复制。如果成功复制“car.docx”后发生故障,AzCopy 会从剩余四个文件中尚未复制的部分继续复制操作。

示例 4:使用文件名匹配模式选择存储 Blob 容器中的文件数量,并将其复制到可从本地访问的目录。

AzCopy https://myaccount.blob.core.windows.net/mycontainer
c:\blob-data car /sourceKey:key /Z /S

“mycontainer”包含以下文件:

car1.docx

car2.docx

car3.docx

train.docx

carfolder/car_sub1.docx

carfolder/train_sub2.docx

subfolder1/car_sub1.docx

subfolder1/car_sub2.docx

复制操作完成后,“c:\blob-data”将包含以下所列的文件。由于指定了前缀为“car”的文件名匹配模式,因此复制操作仅复制前缀为“car”的文件。请注意,如果此前缀直接位于“mycontainer”容器中,则其适用于 Blob,或者适用于子目录名称。

C:\blob-data\car1.docx

C:\blob-data\car2.docx

C:\blob-data\car3.docx

C:\blob-data\carfolder\car_sub1.docx

C:\blob-data\carfolder\train_sub2.docx

性能

在 Windows Azure 数据中心内(即位于同一数据中心内的计算实例和存储帐户之间),用户使用特大计算实例上传和下载大量数据的速度应该能够达到 50MB/s。向 Windows Azure 数据中心传入和传出数据将受到 AzCopy 可用带宽的限制。

已知问题

  • 如果复制时不使用 /XN(排除新文件)和 /XO(排除旧文件),则此工具在复制前仅比较源文件和目标文件的名称。因此,尽管源文件和目标文件完全相同,系统依旧会提示用户是否覆盖目标文件。
  • 如果复制时使用 /XN 和 /XO,请注意您的本地系统时间和存储服务中存储的时间将略有出入。因此,如果差不多同时修改 Blob 和本地文件,比较时可能会做出不正确的筛选。
  • 使用重启恢复选项将文件复制到 Page Blob 时,如果复制操作在中途发生故障,则此工具将从文件的开始位置重新启动复制过程。对于将文件复制到 Block Blob,这一问题则不存在。
  • 如果存储容器下有两个分别名为“a”和“a/b”的 Blob,则无法在该容器下使用 /S 复制这两个 Blob。Windows 不允许在同一文件夹下同时创建名称均为“a”的文件夹和文件。

Aung Oo



Matthew Hendel

Windows Azure 存储团队

本文翻译自:

http://blogs.msdn.com/b/windowsazurestorage/archive/2012/12/03/azcopy-uploading-downloading-files-for-windows-azure-blobs.aspx



AzCopy – 上传/下载 Windows Azure Blob 文件的更多相关文章

  1. [New Portal]Windows Azure Virtual Machine (21) 将本地Hyper-V的VM上传至Windows Azure Virtual Machine

    <Windows Azure Platform 系列文章目录> 本章介绍的内容是将本地Hyper-V的VHD,上传到Azure数据中心,并且保留OS中的内容. 注意:笔者没有执行Syspr ...

  2. 用SpringMVC实现的上传下载方式二(多文件上传)

    参考来源:      http://blog.csdn.net/qq_32953079/article/details/52290208 1.导入相关jar包 commons-fileupload.j ...

  3. 文件上传下载(C#,web,asp.net)

    目的:在浏览器页面启动上传下载CS软件,实现文件的批量下载与上传. 技术路线: 开发上传下载客户端CS程序与注册程序,压缩放到服务器端指定位置: 开发服务器端程序用以接收上传请求,压缩放到服务器端: ...

  4. Java Web 项目的文件/文件夹上传下载

    需求: 支持大文件批量上传(20G)和下载,同时需要保证上传期间用户电脑不出现卡死等体验: 内网百兆网络上传速度为12MB/S 服务器内存占用低 支持文件夹上传,文件夹中的文件数量达到1万个以上,且包 ...

  5. java文件上传下载组件

    需求: 支持大文件批量上传(20G)和下载,同时需要保证上传期间用户电脑不出现卡死等体验: 内网百兆网络上传速度为12MB/S 服务器内存占用低 支持文件夹上传,文件夹中的文件数量达到1万个以上,且包 ...

  6. 2013第38周日Java文件上传下载收集思考

    2013第38周日Java文件上传&下载收集思考 感觉文件上传及下载操作很常用,之前简单搜集过一些东西,没有及时学习总结,现在基本没啥印象了,今天就再次学习下,记录下自己目前知识背景下对该类问 ...

  7. 阿里云负载均衡SLB的文件上传下载问题解决

    Nfs同步文件夹配置 问题描述 : javaweb应用部署到云服务器上时,当服务器配置了SLB负载均衡的时候,多台服务器就会造成文件上传下载获取不到文件的错误, 解决办法有:1.hdfs  2.搭建f ...

  8. JavaWeb 文件上传下载

    1. 文件上传下载概述 1.1. 什么是文件上传下载 所谓文件上传下载就是将本地文件上传到服务器端,从服务器端下载文件到本地的过程.例如目前网站需要上传头像.上传下载图片或网盘等功能都是利用文件上传下 ...

  9. javaEE(14)_文件上传下载

    一.文件上传概述 1.实现web开发中的文件上传功能,需完成如下二步操作: •在web页面中添加上传输入项•在servlet中读取上传文件的数据,并保存到本地硬盘中. 2.如何在web页面中添加上传输 ...

随机推荐

  1. 扩展Visual Studio IDE

    安装visual studio 2012 SDK 下载visual studio SDK. 安装可能遇到的问题 安装时报错:Visual Studio 2012 Install Fails: Prog ...

  2. POJ-1488(字符串应用)

    Description TEX is a typesetting language developed by Donald Knuth. It takes source text together w ...

  3. Spring 基于注解零配置开发

    本文是转载文章,感觉比较好,如有侵权,请联系本人,我将及时删除. 原文网址:< Spring 基于注解零配置开发 > 一:搜索Bean 再也不用在XML文件里写什么配置信息了. Sprin ...

  4. Centos6 下启动httpd报错 Could not reliably determine the server's解决方法

    在启动httpd的时候报错: 修改/etc/httpd/conf/httpd.conf 配置,去掉ServerName 前的#(或者手动添加ServerName localhost:80)然后重启ht ...

  5. Javascript:数组和字符串的相互转化

    中午吃饭的时候,和室友讨论前端的问题,然后一个有趣的问题被抛出来: javascript用什么方法可以把“hello world”位置反转输出,即输出:"dlrow olleh"? ...

  6. [转]Android 网络通信框架Volley简介(Google IO 2013)

    Volley主页 https://android.googlesource.com/platform/frameworks/volley http://www.youtube.com/watch?v= ...

  7. 【浅墨Unity3D Shader编程】之二 雪山飞狐篇:Unity的基本Shader框架写法&amp;颜色、光照与材质

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40955607 作者:毛星云(浅墨)  ...

  8. C++中虚函数的作用是什么?它应该怎么用呢?(转)

    虚函数联系到多态,多态联系到继承.所以本文中都是在继承层次上做文章.没了继承,什么都没得谈. 下面是对C++的虚函数这玩意儿的理解. 一, 什么是虚函数(如果不知道虚函数为何物,但有急切的想知道,那你 ...

  9. Linux中的小程序—— 进度条

    在说正事之前,首先科普一下在什么是回车什么是换行? 我们通常所说的回车就是从一行的末尾跳到另一行的开头,但事实上这却是由回车和换行两个动作所完成的,也就是键盘上<enter>所完成的工作. ...

  10. jstl经典用法

    jstl的forEach使用和set变量实现自增: <body> <c:set var="index" value="0" /> < ...