【スケジューラ】ファイルを操作するタスクを作成してみる

今回は、Sharperlight スケジューラを利用してファイルのコピーやファイルの一覧をファイルに書き出したりしてみようと思います。

下図のようなフォルダ構成を利用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/1d2b84f6-9f27-9f16-bacc-157571ba9b3d.png)
また、それぞれのフォルダにはこのようなファイルが入っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/ade5da1b-973d-a840-33a7-9f7b3a30469f.png)
このフォルダおよびファイルにスケジューラのタスクからアクセスしてみようと思います。

# フォルダのセキュリティ #
Sharperlightは通常、アップリケーションサーバーにインストールされ運用されます。そこでアプリケーションサーバーのフォルダになんら制限もなくアクセスを許すのはセキュリティ上問題があります。
よって、Sharperlightではサイトセットアップを利用し、アクセスを許可するフォルダを登録できるようになっています。早速設定しましょう。
Sharperlightアプリケーションメニューから**サイトセットアップ**を起動します。
ツリービューから`プロダクトの設定`、`システム`を選択します。
プロダクトの設定オプションが右側に表示されます。一番下のオプション`セキュリティで保護されたフォルダー`に今回アクセスしたいフォルダーのパスを指定します。複数ある場合は、**｜パイプ記号**で連結します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/a68d7a3b-949d-baa9-e3f5-1355adf2aa87.png)
サイトセットアップダイアログを`閉じる`ボタンで閉じます。
Sharperlightサービスを再起動し、変更を適用します。

# スケジューラタスクの作成 #
Sharperlightアプリケーションメニューから**スケジューラ**を起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/7566d2f7-5305-1a14-094a-36dc6c535673.png)
`新規`ボタンでタスクの作成を開始します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/bccbf320-a661-f1ac-7c07-67e09e4d1d9a.png)
**一般**タブでは、`コード`、`グループ`および`説明`を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/b5d797e3-b8a0-785f-d457-a690b260f141.png)
**アクション**タブに移動し、実行したい処理をここに定義します。

## ファイル一覧のCSVへの書き出し ##
今回は、C:\QiitaSampleTemp\以下の全ての子フォルダをチェックし、全てのファイルの一覧表をCSVファイルとして作成してみます。同時に全てのファイルをC:\QiitaSample\フォルダにコピーしてみます。
`新規`アイコンでアクションを追加します。
使用可能なアクションの一覧が表示されるので、ここでは**クエリの組み合わせ**を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/15622918-760e-253e-905e-d4fd6dccaa0a.png)
**クエリの組み合わせ**の設定を行います。**クエリの組み合わせ**は、forループのような働きをします。
ここで定義するクエリによって返されたデータセットから一行ずつ次のアクションへ値を渡すことができます。
では、早速`クエリを編集`ボタンでクエリの作成を開始します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/c9dce709-c89f-99db-fd40-31a938a42641.png)
お馴染みのクエリービルダが起動します。`モード`は**概要レポート**、`製品`は**システム**を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/99609e6a-f549-88f9-6b8c-7285214f3917.png)
`テーブル`には、**ファイルの一覧**を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/c6cb1a1e-7398-2891-476e-115dfd12dc9a.png)
`フォルダ`が必須フィルターとして表示されます。フォルダにはアクセスしたいフォルダを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/dd8c14de-e1c2-2859-8a06-c9abb6dd7cb3.png)
サブフォルダへのアクセスを確実にするため、もう一つの必須フィルターである`サブフォルダー`が**Y**になっていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/39f57ff4-a3ee-3409-eec8-1a7eab02c9d2.png)
次に、選択リストから以下のものを出力領域に指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/bafb56f3-4c4c-c8ef-e12e-2e2400de1745.png)
`プレビュー`ボタンでクエリを試行してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/a75244ff-f4a4-51b8-e620-a57f7e358e4c.png)
ファイル情報が返ってきます。一番最初の行は不必要なのでクエリから除外します。`クエリに戻る`ボタンでクエリ定義に戻ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/52b404ac-1752-7bb9-c575-6b9919c404bc.png)
選択リストより**サイズ**をフィルター領域にドラッグ&ドロップで設定します。
条件には**0より大きい**を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/88787ea9-bb41-afba-c35b-ded6785dce67.png)
もう一度`プレビュー`ボタンでクエリを試行してみます。一番最初の不要な行は除外されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/0c690173-9e60-d68e-3fdc-3c2476e27b3e.png)
更に、このクエリでは下記の出力アイテムのみ残し、その他のアイテムは削除します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/5cb44972-1d1e-4f50-ac62-44efa521ceeb.png)
クエリを試行するとこのようなデータセットが返されるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/886a58b7-f5a6-e5a4-1474-578d8e092757.png)


これでクエリは完成、このデータセットから一行ずつ次のアクションにパラメータとして値を渡すことになります。
`OK`ボタンでクエリを保存すると、アクションタブに戻ります。
`新規`アイコンで新しいアクションを追加します。
先に定義した**クエリの組み合わせ**アクションには、ループを終了させるための対となる**クエリの組み合わせ終了**アクションが必須となります。先に追加しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/714542dd-da18-4245-33a6-84263f491187.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/84d2768e-50fb-e618-09b4-dbc2612fddef.png)
では、**クエリの組み合わせ**アクションで取得したデータセットを一行ずつ処理する核となるアクションを定義します。`新規`アイコンで新しいアクションを追加します。**クエリの組み合わせ**アクションと**クエリの組み合わせ終了**アクションの間に定義することとなります。
今度は**クエリ**アクション使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/7af6b6b4-8700-755b-7119-5555bb1e4405.png)
`クエリの編集`ボタンでクエリを定義します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/b247a788-cf0e-858e-f156-5c3505a501d6.png)
クエリのフィルターは前回と同じになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/c4ecbd6a-08b1-d51e-d46f-e0ca68308eb6.png)
ただし、今回は`フォルダー`フィルターに先の**クエリの組み合わせ**アクションで得たフォルダー名を渡すようにします。`フォルダー`フィルターの右端に表示されている一意の参照名`@フォルダー`を利用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/c19d111b-8c0c-88b7-3bd4-ceea64771639.png)
その前に選択リストから以下のアイテムを出力領域に設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/bf72cbec-213d-86bc-eba2-26e20b356207.png)
`OK`ボタンでクエリを保存します。
`クエリのパラメーター`に **フォルダー＝**と記入します。これは先ほどのクエリの`フォルダー`フィルターの参照名を表しています。`フォルダー`フィルターに値を渡すという意味です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/0643b329-9618-8ff0-b94b-b3b114575027.png)
渡す値は、先の**クエリの組み合わせ**アクションで得たフォルダー名なので、右端の参照ボタンで検索し設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/d0f723e7-a8ab-f2da-eddc-23c2e3dfb0ab.png)
`OK`ボタンで設定を完了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/d68144fe-b89b-3e3a-1c0a-24c734108527.png)
次に、このクエリの結果をCSVファイルに書込みます。その設定は右側にあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/3e484cb8-c9bf-270c-d0e2-92521bfa3f2e.png)
このような設定になります。追加チェックボックスは、データを同じファイルに追加するという意味になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/58b81919-c8b1-2551-0d31-1d54c8ee1186.png)

## ファイルのコピー ##
**ファイルのコピー**アクションを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/a56df526-0c1b-a896-e99a-b93d72dd6fce.png)
そしてファイルおよびコピー先を以下のように設定します。先の**クエリの組み合わせ**アクションの戻り値を利用します。
`OK`ボタンでアクションを保存。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/98f18cff-5fb0-d149-a43b-6b6b41b9bcc8.png)

これで核となるアクションの定義も完了しました。
`OK`ボタンでタスクを保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/439da7c4-40ac-29f2-e52b-5fedd4634677.png)

尚、サイトセットアップの`セキュリティで保護されたフォルダー`オプションに、**C:\QiitaSampleCopy**フォルダも追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/918dff39-5efc-cb44-ca3e-138ae87e4394.png)


# スケジューラタスクの検証 #
右クリックメニューから**実行**を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/aa456c54-64b7-c8b9-e539-3fb378aae87b.png)
エラー等が表示されなければ正常です。
早速、作成されているはずのファイル一覧 **FileList.csv**を探してみましょう。
確認できますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/a3eea6a3-1697-770c-b3e8-c6e26aa210cb.png)
下図のような日本語の列見出しがそのままCSVファイルに出力されますが、テキストエディタ等で開いた場合に列見出しが文字化けしている場合があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/5e934182-b7e6-27e2-ebbb-6f16d963ec42.png)
その場合はこのエンコーディングオプションで対応可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/fe4860bc-4a53-cfc8-77a7-ef5d4e4c2725.png)

更に**C:QiitaSampleCopy**フォルダを見てみます。ファイルがコピーされているのがわかりますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/be2302a7-9374-bdc8-caf9-678f99f8bce3.png)


# あとがき #
今回はSharperlightのスケジューラを利用してファイル一覧を作成したり、ファイルをコピーしてみました。
スケジューリングを利用して行うような作業ではありませんが、数多くある機能のうち、このような使い方もできるのだなということがお伝えできればと思いました。
では失礼します。