コンテンツにスキップ

$ps.file.copyFile

概要

サーバスクリプトで$ps.fileを使用して指定ファイルをコピーします。

前提条件

Script.jsonのDisableServerScriptFileを false に設定することが必要です。

構文

$ps.file.copyFile(section, sourcePath, destPath)

パラメータ

パラメータ 型 必須 説明
section string ○ セクション名。セクションについては$ps.fileの「セクションについて」を参照ください。
sourcePath string ○ コピー元ファイルパス。ディレクトリの区切り文字はWindow、Linux共に「/」を利用する。
destPath string ○ コピー先ファイルパス。ディレクトリの区切り文字はWindow、Linux共に「/」を利用する。

戻り値

ファイルをコピーできた場合は true、コピーできなかった場合は false を返却します。

例外

C#内で例外が発生した場合はサーバスクリプト内に例外クラス名とエラーメッセージをErrorオブジェクトに入れて例外を発生させます。

使用例

以下の例では、Webサーバ内のディレクトリ "parts_01" 内の指定ファイルをディレクトリ "parts_02" にコピーします。

JavaScript
$ps.file.copyFile('01_develop', 'parts_01/document.txt', 'parts_02/document.txt');

以下の例では、Webサーバ内のディレクトリ "parts_01" 内の"document.txt"を同じディレクトリ内に"document_2.txt"としてコピーします。

JavaScript
$ps.file.copyFile('01_develop', 'parts_01/document.txt', 'parts_01/document_2.txt');

サンプルコード

1. 案件を提出にしたとき、作業中のファイルを提出した日の版としてコピーする

案件を「提出」にしたとき、作業フォルダ(work)のファイルを$ps.file.getFileListで取得し、$ps.file.copyFileで提出した日のフォルダ(submitted/YYYYMMDD)へコピーします。

実務での使いどころ

見積書・設計書などを顧客に出したとき、出した時点の版を残しておけます。作業フォルダのファイルはこのあとも書き換えるので、どの版を出したかがあとからわからなくなるのを防げます。標準の添付ファイルはレコードに付けて保存するもので、サーバのフォルダを決まった形で作ったり、移したり、消したりはできません。

事前準備

1:Script.jsonのDisableServerScriptFileをfalseにし、ServerScriptFilePathを設定して、プリザンターを再起動してください($ps.fileの前提条件)。案件のファイル置き場は、このフォルダの下に案件コードの名前のセクションとして作られます。

2:「案件管理」テーブル(期限付きテーブル)で、以下を設定し、エディタに表示してください。

項目コード 内容
分類A(ClassA) 案件コード(半角英数字と_・-・.)
状況(Status) 「100,見積中」「200,受注」「300,提出」「900,完了」「920,失注」

3:「案件管理」テーブルにサーバスクリプトを登録します。

3-1:「テーブルの管理 > サーバスクリプト」タブで「新規作成」を選択する。
 3-2:タイトル: 任意の名前(例:copySubmittedVersion)
 3-3:スクリプト: 下記サンプルコードを貼り付け
 3-4:条件: 「更新前」にチェック

JavaScript
// 「提出」の状況の値
const SUBMITTED = 300;

// 案件を提出にしたとき、作業フォルダ(work)のファイルを、提出した日の版(submitted/YYYYMMDD)としてコピーする
function copySubmittedVersion() {
    // saved は更新前の値。提出の案件を保存し直したときは何もしない
    if (model.Status !== SUBMITTED || Number(saved.Status) === SUBMITTED) {
        return;
    }
    const section = model.ClassA;
    if (!/^[A-Za-z0-9_.-]+$/.test(section || '')) {
        context.Error('案件コードは、半角英数字と _ - . で入力してください。');
        return;
    }
    // getFileList はファイル名のみを返す(フォルダは含まない。フォルダが無いときは空)
    const files = Array.from($ps.file.getFileList(section, 'work'));
    if (files.length === 0) {
        context.Error('作業フォルダ(work)にファイルがありません。');
        return;
    }
    const pad = (n) => String(n).padStart(2, '0');
    const now = new Date();
    const version = `submitted/${now.getFullYear()}${pad(now.getMonth() + 1)}${pad(now.getDate())}`;
    // copyFile は、コピー先のフォルダが無ければ作る。同じ名前のファイルがあると上書きせず false を返す
    const failed = files.filter((file) => !$ps.file.copyFile(section, `work/${file}`, `${version}/${file}`));
    if (failed.length > 0) {
        context.Error(`${version} にコピーできないファイルがあります(同じ日に提出済みでないか確かめてください):${failed.join('、')}`);
        return;
    }
    logs.LogInfo(`[copySubmittedVersion] ${section}/${version} に ${files.length} 件をコピーしました`, 'main');
}

copySubmittedVersion();

注記

  • copyFileは、コピー先のフォルダが無ければ作ります。コピー先に同じ名前のファイルがあると、上書きせずにfalseを返します。同じ日にもう一度提出すると、このサンプルはcontext.Errorで止めます。
  • getFileListはファイル名のみを返します。作業フォルダの中のフォルダはコピーしません。
  • 状況が「提出」に変わる更新のときのみ動きます。APIで状況を変えたときも動きます。
  • セクション名・フォルダ名に使えるのは、半角英数字と_・-・.のみです。日本語などを使うと例外になるため、案件コードを先に確かめています。
  • 「案件のファイル置き場」のサンプルは4本あり、同じ「案件管理」テーブルに並べて使えます:createSection(受注)・copyFile(提出)・moveDirectory(完了)・removeSection(失注)。同じ条件のサーバスクリプトはまとめて実行されるため、ファイルの先頭で宣言する名前が重ならないようにしています。

対応バージョン

対応バージョン 内容
1.4.19.0 以降 機能追加

関連情報