C#でWebDAVサーバとやり取りする方法について

サークルで使用しているソフトウェアで今までは,GoogleDriveからいろんなファイルをダウンロード,アップロードしていましたが,WebDAVサーバからインストーラーを落としてくるようにするために修正をしていました. その時に学習した内容について書きます.

今回は,NuGet packageマネージャを使用して,GitHub - skazantsev/WebDavClient: Asynchronous cross-platform WebDAV client for .NET Coreをインストールして使用しました.

先に,アクセス先のWebDAVサーバでアプリでアクセスするためのトークンを発行しておきます. OwnCloudなら,設定>セキュリティに進み「パスワード/トークンを追加する」の項目からトークンを発行できます.

ファイルをダウンロードして,新規に保存するのであれば,次のようにするとできます.

// baseURLは,アクセスするWebDAVサーバのURL.OwnCloudなら,https://example.com/owncloud/public.php/webdav かな.
string baseAddr = baseURL + "/someDirectory/";
var clientParams = new WebDav.WebDavClientParams
{
    // ダウンロードするファイルがあるディレクトリを指定
    BaseAddress = new Uri(baseAddr),
    // ユーザ名とトークンを指定
    Credentials = new NetworkCredential(username, token)
};
_client = new WebDav.WebDavClient(clientParams);
var result = _client.GetRawFile(filename).Result;

if (!result.IsSuccessful)  return false;

// ダウンロードしたファイルをdestinationで指定したファイルへ保存
using (FileStream fs = new FileStream(destination, FileMode.Create))
{
    result.Stream.CopyTo(fs);
}

また,ディレクトリにあるファイルのリストを取得する場合には,次のようにします.

string baseAddr = baseURL + "/someDirectory/";
var clientParams = new WebDav.WebDavClientParams
{
    BaseAddress = new Uri(baseAddr),
    Credentials = new NetworkCredential(username, token)
};
_client = new WebDav.WebDavClient(clientParams);

var result = _client.Propfind(baseURL + "/someDirectory/").Result;
if (result.IsSuccessful)
{
    foreach (var res in result.Resources)
    {
        if (!res.IsCollection)
        {
            var filename = Path.GetFileName(res.Uri);
        }
    }
}

ローカルのファイルをアップロードする場合は,次のようにします.

# test.txtを WebDAVサーバ上の/someDirecotry/dest.txtにアップロードする.
var localFile = "test.txt"
var destination = "dest.txt";
string baseAddr = baseURL + "/someDirectory/";
var clientParams = new WebDav.WebDavClientParams
{
    BaseAddress = new Uri(baseAddr),
    Credentials = new NetworkCredential(username, token)
};

_client = new WebDav.WebDavClient(clientParams);
using (FileStream fs = new FileStream(localFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
    var result = _client.PutFile(destination, fs).Result;
    return result.IsSuccessful;
}