C++ での Azure Files 用の開発

ヒント

Microsoft Azure ストレージ エクスプローラーを試す

Microsoft Azure ストレージ エクスプローラーは、Windows、macOS、Linux で Azure Storage のデータを視覚的に操作できる Microsoft 製の無料のスタンドアロン アプリです。

適用対象

ファイル共有の種類 SMB NFS
Standard ファイル共有 (GPv2)、LRS/ZRS はい いいえ
Standard ファイル共有 (GPv2)、GRS/GZRS はい いいえ
Premium ファイル共有 (FileStorage)、LRS/ZRS はい いいえ

このチュートリアルについて

このチュートリアルでは、C++ を使用して Azure Files で基本的な操作を行う方法について説明します。 Azure Files を初めて利用する場合は、各セクションの概念をお読みください。サンプルを理解する上で役立ちます。 ここでは、次のサンプルについて説明します。

  • Azure ファイル共有を作成および削除する
  • ディレクトリを作成および削除する
  • ファイルのアップロード、ダウンロード、および削除
  • ファイルのメタデータを設定して一覧表示する

Note

Azure Files には SMB 経由でアクセスできるため、標準の C++ I/O クラスおよび関数を使用して Azure ファイル共有にアクセスする単純なアプリケーションを記述できます。 この記事では、File REST API を使用して Azure Files と通信する Azure Storage C++ SDK を使用するアプリケーションを記述する方法について説明します。

前提条件

設定

このセクションでは、C++ 用 Azure Blob Storage クライアント ライブラリ v12 を操作するためのプロジェクトの準備について説明します。

パッケージのインストール

vcpkg install コマンドにより、C++ 用の Azure Storage Blob SDK と必要な依存関係がインストールされます。

vcpkg.exe install azure-storage-files-shares-cpp:x64-windows

詳細については、GitHub にアクセスして、C++ 用 Azure SDK を入手し、ビルドします。

プロジェクトの作成

Visual Studio で、FilesShareQuickstartV12 という、Windows 向けの新しい C++ コンソール アプリケーションを作成します。

新しい C++ Windows コンソール アプリを構成するための Visual Studio ダイアログ

Azure Portal で資格情報をコピーする

サンプル アプリケーションから Azure Storage に対して要求を実行するときは、承認されている必要があります。 要求を承認するには、ストレージ アカウントの資格情報を接続文字列としてアプリケーションに追加します。 ストレージ アカウントの資格情報を表示するには、次の手順に従います。

  1. Azure portal にサインインします。

  2. 自分のストレージ アカウントを探します。

  3. ストレージ アカウント メニュー ウィンドウの [セキュリティとネットワーク] で、 [アクセス キー] を選択します。 ここで、アカウント アクセス キーと各キーの完全な接続文字列が確認できます。

    Azure portal 内のアクセス キー設定の場所を示すスクリーンショット

  4. [アクセス キー] ペインで、 [キーの表示] を選択します。

  5. [key1] セクションで、 [接続文字列] の値を見つけます。 [クリップボードにコピー] アイコンを選択して、接続文字列をコピーします。 次のセクションで、この接続文字列の値を環境変数に追加します。

    Azure portal から接続文字列をコピーする方法を示すスクリーンショット

ストレージ接続文字列の構成

接続文字列をコピーした後、アプリケーションを実行しているローカル マシンの新しい環境変数にそれを書き込みます。 環境変数を設定するには、コンソール ウィンドウを開いて、お使いのオペレーティング システムの手順に従います。 <yourconnectionstring> は、実際の接続文字列に置き換えてください。

setx AZURE_STORAGE_CONNECTION_STRING "<yourconnectionstring>"

Windows で環境変数を追加した後、コマンド ウィンドウの新しいインスタンスを開始する必要があります。

プログラムの再起動

環境変数を追加した後、環境変数の読み取りを必要とする実行中のプログラムをすべて再起動します。 たとえば、続行する前に、ご使用の開発環境またはエディターを再起動します。

コード例

以下のサンプル コード スニペットでは、C++ 用 Azure Files 共有クライアント ライブラリを使用して以下のタスクを実行する方法を示します。

インクルード ファイルを追加する

プロジェクト ディレクトリで次の操作を行います。

  1. Visual Studio で FilesShareQuickstartV12.sln ソリューション ファイルを開きます。
  2. Visual Studio 内で、FilesShareQuickstartV12.cpp ソース ファイルを開きます。
  3. main 内の自動生成されたコードをすべて削除します。
  4. #include ステートメントを追加します。
#include <iostream>
#include <stdlib.h>
#include <vector>

#include <azure/storage/files/shares.hpp>

接続文字列を取得する

以下のコードでは、「ストレージ接続文字列の構成」で作成した環境変数から、ストレージ アカウントに対する接続文字列を取得します。

このコードを main() 内に追加します。

        // Retrieve the connection string for use with the application. The storage
        // connection string is stored in an environment variable on the machine
        // running the application called AZURE_STORAGE_CONNECTION_STRING.
        // Note that _MSC_VER is set when using MSVC compiler.
        static const char* AZURE_STORAGE_CONNECTION_STRING = "AZURE_STORAGE_CONNECTION_STRING";
#if !defined(_MSC_VER)
        const char* connectionString = std::getenv(AZURE_STORAGE_CONNECTION_STRING);
#else
        // Use getenv_s for MSVC
        size_t requiredSize;
        getenv_s(&requiredSize, NULL, NULL, AZURE_STORAGE_CONNECTION_STRING);
        if (requiredSize == 0) {
            throw std::runtime_error("missing connection string from env.");
        }
        std::vector<char> value(requiredSize);
        getenv_s(&requiredSize, value.data(), value.size(), AZURE_STORAGE_CONNECTION_STRING);
        std::string connectionStringStr = std::string(value.begin(), value.end());
        const char* connectionString = connectionStringStr.c_str();
#endif

ファイル共有を作成する

CreateFromConnectionString 関数を呼び出して、ShareClient クラスのインスタンスを作成します。 次に、CreateIfNotExists を呼び出して、ストレージ アカウントに実際のファイル共有を作成します。

main() の末尾に次のコードを追加します。

using namespace Azure::Storage::Files::Shares;

std::string shareName = "sample-share";

// Initialize a new instance of ShareClient
auto shareClient = ShareClient::CreateFromConnectionString(connectionString, shareName);

// Create the files share. This will do nothing if the files share already exists.
std::cout << "Creating files share: " << shareName << std::endl;
shareClient.CreateIfNotExists();

ファイル共有にファイルをアップロードする

次のコード スニペット:

  1. "Hello Azure!" を含む文字列を宣言します。
  2. ルート ShareDirectoryClient を取得し、[ファイル共有の作成] セクションのファイル共有で GetFileClient を呼び出すことによって、ShareFileClient オブジェクトへの参照を取得します。
  3. UploadFrom 関数を呼び出して、文字列をファイルにアップロードします。 この関数では、ファイルがまだ存在しない場合は作成し、既に存在する場合は更新します。

main() の末尾に次のコードを追加します。

std::string fileName = "sample-file";
uint8_t fileContent[] = "Hello Azure!";

// Create the ShareFileClient
ShareFileClient fileClient = shareClient.GetRootDirectoryClient().GetFileClient(fileName);

// Upload the file
std::cout << "Uploading file: " << fileName << std::endl;
fileClient.UploadFrom(fileContent, sizeof(fileContent));

ファイルのメタデータを設定する

ShareFileClient.SetMetadata 関数を呼び出して、ファイルのメタデータ プロパティを設定します。

main() の末尾に次のコードを追加します。

Azure::Storage::Metadata fileMetadata = { {"key1", "value1"}, {"key2", "value2"} };
fileClient.SetMetadata(fileMetadata);

ファイルのメタデータを一覧表示する

ShareFileClient.GetProperties 関数を呼び出して、ファイルのメタデータ プロパティを取得します。 メタデータは、返された ValueMetadata フィールドの下に あります。 メタデータは、ファイルのメタデータを設定する例と同様に、キーと値のペアになります。

// Retrieve the file properties
auto properties = fileClient.GetProperties().Value;
std::cout << "Listing blob metadata..." << std::endl;
for (auto metadata : properties.Metadata)
{
    std::cout << metadata.first << ":" << metadata.second << std::endl;
}

ファイルをダウンロードする

アップロードされたファイルのプロパティを使用して、「ファイルのメタデータを一覧表示する」で取得したファイルのプロパティを新しい std::vector<uint8_t> オブジェクトに保存します。 ShareFileClient 基底クラスの DownloadTo 関数を呼び出して、先ほど作成したファイルを新しい std::vector<uint8_t> オブジェクトにダウンロードします。 最後に、ダウンロードされたファイルのデータを表示します。

main() の末尾に次のコードを追加します。

std::vector<uint8_t> fileDownloaded(properties.FileSize);
fileClient.DownloadTo(fileDownloaded.data(), fileDownloaded.size());

std::cout << "Downloaded file contents: " << std::string(fileDownloaded.begin(), fileDownloaded.end()) << std::endl;

ファイルを削除する

次のコードでは、ShareFileClient.Delete 関数を呼び出して、Azure Storage ファイル共有から BLOB を削除します。

std::cout << "Deleting file: " << fileName << std::endl;
fileClient.DeleteIfExists();

ファイル共有を削除する

次のコードでは、ShareClient.Delete を使用してファイル共有全体を削除することで、アプリによって作成されたリソースをクリーンアップします。

main() の末尾に次のコードを追加します。

std::cout << "Deleting files share: " << shareName << std::endl;
shareClient.DeleteIfExists();

コードの実行

このアプリは、コンテナーを作成し、テキスト ファイルを Azure Blob Storage にアップロードします。 さらに、この例では、コンテナー内の BLOB を一覧表示し、ファイルをダウンロードして、ファイルの内容を表示します。 最後に、BLOB とコンテナーを削除します。

アプリの出力は、次の例のようになります。

Azure Files Shares storage v12 - C++ quickstart sample
Creating files share: sample-share
Uploading file: sample-file
Listing file metadata...
key1:value1
key2:value2
Downloaded file contents: Hello Azure!
Deleting file: sample-file
Deleting files share: sample-share

次のステップ

このクイックスタートでは、C++ を使用してファイルをアップロード、ダウンロード、一覧表示する方法について学習しました。 また、Azure Storage ファイル共有の作成方法と削除方法についても学習しました。

C++ Blob Storage サンプルを確認するには、次の記事に進んでください。