†REXXのどろぬま†

NcFtpPutを使用した更新アップロード

作成開始日 2025.05.05
最終更新日

アップロードしたいファイルのあるローカルのディレクトリに、直近の更新日時のデータを置き、それ以降のタイムスタンプのファイルを選び出してアップロードする。ポイントは、ftpサーバ上のファイルのタイムスタンプと比較している訳ではない点。このため、処理がかなり簡便になる。

なお、この例では、カレントディレクトリにあるhtm/htmlファイルの更新をチェックしている(サブディレクトリは対象外)。そして、ftpサーバ上の「/html」にある《カレントディレクトリと同名のディレクトリ》にファイルをアップしている。

たとえば、ローカルのファイルが「E:\MyHomepage\diary」にあれば、更新ファイルはftpサーバ上の「/htm/diary」にアップロードされる。アップロード先は変数dnameで設定しているので、必要に応じて書き換える。同様に、アップロードするファイルの拡張子は変数maskで変更可能。ただし、複数の「.」を含むファイル名には対応していない(対応させる事は難しくないが…)。

/*********************************************/
/* fud.cmd : ftp update uploader 2025.06.12  */
/* STREAM query datetime版 秒単位まで扱える  */
/* upload対象ファイルは変数maskで設定        */
/*********************************************/
Call RxFuncAdd 'SysLoadFuncs', 'RexxUtil', 'SysLoadFuncs'
Call SysLoadFuncs

/*** 初期設定 ***/
/*プログラムのパスとユーザー名、パスワードはそれぞれの環境合わせて設定する*/
ncftp = 'C:\.....\ncftpput -u username -p password'
/*同様に接続するサーバ名も各自の環境に合わせて設定する*/
srv   = 'host.name.ne.jp'
/*アップロード先のディレクトリ:以下の例は/htmlの下のローカルと同名のディレクトリ*/
dname = '/html/'||filespec('N',DIRECTORY())	/* カレント・ディレクトリ */
updat = DIRECTORY()'\@update.dat'		/* 更新日付データ */
mask  = 'html htm jpg gif'			/* upload対象ファイル */

/*** 更新日付のデータがない場合の処理:現在日時で仮作成 ***/
IF STREAM(updat,'C','query exist')='' THEN
Do
  SAY '*** no update data file'
  SAY '*** save current date&time'
  SAY '*** edit :' updat
  '@ECHO' date('Ordered') time('Normal')'>' updat
  EXIT
End

/*** 更新日時データの読み込み ***/
rc=STREAM(updat,'C','O')
last_dt=LINEIN(updat)
rc=STREAM(updat,'C','C')
SAY last_dt '[last update]'
SAY '-------------------------------'

/*** メインルーチン ***/
rc=SysFileTree('*.*','file','FO')
files=''
Do n=1 to file.0
  PARSE VAR file.n dmy '.' ext
  IF POS(ext,mask)=0 THEN ITERATE
  dt=STREAM(file.n,'C','query datetime')
  PARSE VAR dt mm '-' dd '-' yy tm dmy		/* dmyはバグ対策:必須 */
  dt=yy'/'mm'/'dd tm

  IF dt>last_dt THEN
  Do
    SAY dt FILESPEC('N',file.n)
    files=files' 'file.n
  End
End

IF files='' THEN DO; SAY '*** no upload files ***'; EXIT; END;

SAY '*** upload ok ? ***'
PULL st
IF st='N' THEN EXIT	/* PULLの入力は大文字化される */

/* アップロードの実行 */
ncftp srv dname files

/*更新日時の書き込み*/
'@echo' date('Ordered') time('Normal')'>' updat
EXIT


【REXXのどろぬま目次】 【ホーム】