OneDrive のファイルをダウンロードする - C#

C#のプログラムから、OneDrive のファイルをダウンロードする手順を紹介します。

概要

C#のプログラムから、OneDriveのファイルをダウンロードします。
ファイルをダウンロードするには、OneDriveの要素のIDからDriveItem オブジェクトを取得し、DriveItem オブジェクトの Content プロパティを参照して ストリームを取得してファイルのダウンロードをします。

事前準備

OneDriveファイルの準備

OneDriveにファイルを配置します。今回はルートディレクトリに下図のファイルを配置しています。
今回のコードでは、"img1.png" ファイルをダウンロードします。

プログラムの準備

OneDriveのAPIを呼び出すプログラムを作成する前に、アプリケーションの登録や設定が必要です。
以下の準備をする必要があります。手順の詳細はこちらの記事を参照してください。
  • Azure Active Directory へのプログラム登録
  • パブリック クライアント フローを有効にする
  • ファイルAPIのAPIアクセス許可を追加
  • APIのアクセス許可
  • Microsoft.Graph ライブラリのインストール

ダウンロードするファイルのIDを取得

ダウンロードするファイルのIDを調べて取得します。OneDriveの要素のIDを取得する方法は、 指定フォルダのファイル、フォルダの一覧を取得する方法、または、ファイル、フォルダを検索して取得する方法があります。 ファイルのリストを取得する方法はこちらの記事、 ファイルを検索する方法はこちらの記事を参照してください。

プログラム

UI

下図のフォームを作成します。ボタンとMultilineプロパティをTureに設定した複数行のテキストボックスを配置します。

コード

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Microsoft.Identity.Client;
using Microsoft.Graph;

namespace SimpleCallApi
{
  public partial class FormDownload : Form
  {
    public static IPublicClientApplication PublicClientApp;
    private string ClientId = "(クライアントID)";
    private string TenantId = "(テナントID)";

    public FormDownload()
    {
      InitializeComponent();
    }

    private async void button1_Click(object sender, EventArgs e)
    {
      PublicClientApplicationBuilder app = PublicClientApplicationBuilder.Create(ClientId);
      app = app.WithRedirectUri("https://login.microsoftonline.com/common/oauth2/nativeclient");
      app = app.WithAuthority(AzureCloudInstance.AzurePublic, TenantId);
      PublicClientApp = app.Build();
      //
      string[] scopes = new string[] { "User.ReadWrite.All" };
      string password = "(OneDriveにサインインするアカウントのパスワード)";
      System.Security.SecureString secpass = new System.Security.SecureString();

      foreach (char c in password) secpass.AppendChar(c);

      AcquireTokenByUsernamePasswordParameterBuilder builder = PublicClientApp.AcquireTokenByUsernamePassword(scopes, "(OneDriveにサインインするアカウント)", secpass);
      AuthenticationResult authResult = await builder.ExecuteAsync();

      DelegateAuthenticationProvider prov = new DelegateAuthenticationProvider(
        (requestMessage) =>
        {
          requestMessage.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("bearer", authResult.AccessToken);
          return Task.FromResult(0);
        }
        );
      GraphServiceClient client = new GraphServiceClient(prov);

      System.IO.Stream stream = await client.Me.Drive.Items["01VGRRKKPLGAETCFNMJRF3TAHROCGS2ZB6"].Content.Request().GetAsync();
      byte[] buffer = new byte[stream.Length];
      stream.Read(buffer);
      stream.Close();
      
      System.IO.FileStream fs = new System.IO.FileStream("download-test.png", System.IO.FileMode.CreateNew);
      fs.Write(buffer, 0, buffer.Length);
      fs.Close();

      textBox1.Text += "ダウンロードしました。";
    }
  }
}

解説

OneDriveのライブラリの初期化やOneDriveへのサインイン、アクセストークンの取得についてはこちらの記事を参照してください。

GraphServiceClient オブジェクトを作成します。
   GraphServiceClient client = new GraphServiceClient(prov);

GraphServiceClient オブジェクトの .Me.Drive.Items["01VGRRKKPLGAETCFNMJRF3TAHROCGS2ZB6"].Content プロパティにアクセスします。Itemsプロパティの添え字の文字列 01VGRRKKPLGAETCFNMJRF3TAHROCGS2ZB6 がダウンロードするファイルのIDになります。 今回の例では先に紹介したOneDriveのルートディレクトリにある、"img1.png" ファイルのIDを設定しています。
ストリームを非同期で取得するため、.Request().GetAsync() メソッドを呼び出し、ストリームオブジェクトを取得します。
  System.IO.Stream stream = await client.Me.Drive.Items["01VGRRKKPLGAETCFNMJRF3TAHROCGS2ZB6"].Content.Request().GetAsync();

取得したStreamオブジェクトからファイルのデータを読み出します。読み出しはストリームのRead()メソッドを利用して、バイト配列(bytep[])で読み出します。
  byte[] buffer = new byte[stream.Length];
  stream.Read(buffer);
  stream.Close();

FileStreamオブジェクトを作成して読みだしたファイルのデータをローカルディスクに保存します。ファイル名は"download-test.png"としています。
  System.IO.FileStream fs = new System.IO.FileStream("download-test.png", System.IO.FileMode.CreateNew);
  fs.Write(buffer, 0, buffer.Length);
  fs.Close();

ダウンロード完了後、テキストボックスにメッセージを表示します。
  textBox1.Text += "ダウンロードしました。";

実行結果

上記のプロジェクトを実行します。下図のウィンドウが表示されます。


[button1]をクリックします。ダウンロード処理が実行され、ダウンロードが完了すると下図のメッセージがテキストボックスに表示されます。


実行ファイルのあるディレクトリをエクスプローラーで確認します。ファイル一覧に "download-test.png" ファイルが存在していることが確認できます。


"download-test.png" ファイルを開いて画像を確認します。OneDriveに配置してある画像ファイルと同じ内容が表示されることが確認できます。


OneDriveからファイルをダウンロードできました。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2022-12-14
作成日: 2021-06-08
iPentec all rights reserverd.