🚡
【F#, Google Drive】ローカルフォルダをアップロードするプログラムを作ってみた
概要
指定したフォルダを Google Drive にアップロードする F# のプログラムを作ったので紹介します。
機能
- 指定したフォルダ・ファイルを除外する
- 前回のアップロードから変更されたフォルダ・ファイルのみ更新する
使用方法
- .NET SDK をインストールする
- プロジェクトに移動してスクリプト
init.fsx
を実行する
dotnet fsi init.fsx
- 作成された
UserData.fs
に Google Drive API を使用する上で必要な情報を記入する
UserData.fs
[<AutoOpen>]
module UserData
let ClientId = "クライアント ID"
let ClientSecret = "認可コード"
let RefreshToken = "リフレッシュトークン"
- ビルドする
dotnet publish -r win-x64 -p:PublishSingleFile=true --self-contained false
- アップロードするフォルダの絶対パスを
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
関連記事
- F# - HTTP で Google Drive API を利用する
- 【F#】Google Drive API のエラーハンドリング
- .NET 5, F# - Google Drive API Quickstart +α
Discussion