🚡

【F#, Google Drive】ローカルフォルダをアップロードするプログラムを作ってみた

2021/09/09に公開

概要

指定したフォルダを Google Drive にアップロードする F# のプログラムを作ったので紹介します。

https://github.com/shikatan0/google-drive-folder-uploader

機能

  • 指定したフォルダ・ファイルを除外する
  • 前回のアップロードから変更されたフォルダ・ファイルのみ更新する

使用方法

  1. .NET SDK をインストールする
  2. プロジェクトに移動してスクリプト init.fsx を実行する
dotnet fsi init.fsx
  1. 作成された UserData.fs に Google Drive API を使用する上で必要な情報を記入する
UserData.fs
[<AutoOpen>]
module UserData

let ClientId     = "クライアント ID"
let ClientSecret = "認可コード"
let RefreshToken = "リフレッシュトークン"
  1. ビルドする
dotnet publish -r win-x64 -p:PublishSingleFile=true --self-contained false
  1. アップロードするフォルダの絶対パスを settings\target に記述する

指定したフォルダ・ファイルを除外する

フォルダ・ファイルの指定は glob 風の記法で settings\ignore に記述する方式です。
実装としては下記のように記法から正規表現を生成しています。

module Pattern =
    /// 正規表現における特殊文字をエスケープする
    let private escape (text: string) : string =
        text
            .Replace("\\", "\\\\")
            .Replace("/", "\\\\")
            .Replace(".", "\\.")

    /// パターンにおける特殊文字を正規表現に置換する
    let private replace (text: string) : string =
        text
            .Replace("*", "[^\\\\]*?")

    /// パターンを表す正規表現の文字列に変換する
    let private convert (text: string) : string =
        $"^.*\\\\{text}$" //「^.*\\xx$」

    /// 文字列から正規表現を生成する
    let private regex (text: string) : System.Text.RegularExpressions.Regex =
        System.Text.RegularExpressions.Regex(
            text,
            System.Text.RegularExpressions.RegexOptions.Compiled
        )

    /// パターン文字列から正規表現を生成する
    let ToRegex = escape >> replace >> convert >> regex

特殊文字は 0 文字以上の /, \ 以外の文字列を表す * (glob の * と等価) のみで、先頭には常に 0 文字以上の文字列が入る可能性があります (glob で **/ を先頭に記述した場合と等価)。

最後に

以上、Google Drive にフォルダをアップロードする F# のプログラムの紹介でした。
プログラム終了時にスリープするようになっているので不要な場合はビルド前に当該部分を削除してみてください。

SetSuspendState(false, false, false) |> ignore

関連記事

end

GitHubで編集を提案

Discussion