フォルダ同期化

 投稿者:しばっち  投稿日:2013年10月26日(土)19時27分47秒
  DOSプロントのdirコマンドを実行し、ファイルリストを得る。
リダイレクト「>」が、WITH句でうまく機能しない為
batファイルを用意した。

なお、実行しても実際のフォルダ同期化は行わず、batファイルを出力するだけです。
そのbatファイルを実行することで同期化が行われます。

'filelist.bat
dir %1 /tw /on /s /-c > %2
------------------------------------------
PUBLIC STRING BAT$
DIM NAME1$(10000),DA1$(10000),TI1$(10000)
DIM NAME2$(10000),DA2$(10000),TI2$(10000)
LET BAT$="同期化.bat" !'パスを指定
DIRECTORY GETNAME FOLDER1$
IF FOLDER1$="" THEN STOP
PRINT FOLDER1$
DIRECTORY GETNAME FOLDER2$
IF FOLDER2$="" THEN STOP
PRINT FOLDER2$
!'DO
!'READ IF MISSING THEN EXIT DO:FOLDER1$,FOLDER2$
CALL GETLIST(N,NAME1$,DA1$,TI1$,FOLDER1$)
CALL GETLIST(M,NAME2$,DA2$,TI2$,FOLDER2$)
CALL COMPARE(N,FOLDER1$,NAME1$,DA1$,TI1$,M,FOLDER2$,NAME2$,DA2$,TI2$)
CALL COMPARE(M,FOLDER2$,NAME2$,DA2$,TI2$,N,FOLDER1$,NAME1$,DA1$,TI1$)
!'LOOP
!'DATA
OPEN #1:NAME BAT$
SET #1:POINTER END
PRINT #1:"DEL ";CHR$(34);BAT$;CHR$(34) !'batファイル自身の消去
CLOSE #1
END

EXTERNAL SUB GETLIST(N,FILENAME$(),FILEDATE$(),FILETIME$(),PA$)
!'dirコマンドで表示の1文字目から10文字目迄を日付、13文字目から17文字目迄を時間、18文字目から35文字目迄をサイズ
!'36文字目以降をファイル名としている
LET TMP$="filelist.tmp" !'パスを指定
EXECUTE "filelist.bat" WITH(PA$,TMP$) !'パスを指定
OPEN #1:NAME TMP$
LET N=0
DO
   LINE INPUT #1,IF MISSING THEN EXIT DO:A$
   IF POS(A$," のディレクトリ")>0 THEN
      LET PATH$=LTRIM$(BEFORESTRING$(A$," のディレクトリ"))
      LET PATH$=AFTERSTRING$(PATH$,PA$ & "\")
      IF PA$=PATH$ THEN LET PATH$="" ELSE LET PATH$=PATH$ & "\"
   END IF
   IF A$<>"" AND LEFT$(A$,1)<>" " AND POS(A$,"<DIR>")=0 THEN
      LET N=N+1
      LET FILEDATE$(N)=LTRIM$(A$(1:10)) !'日付
      LET FILETIME$(N)=LTRIM$(A$(13:17)) !'時間
      !'LET FILESIZE(N)=VAL(A$(18:35)) 'ファイルサイズ
      LET FILENAME$(N)=PATH$ & LTRIM$(A$(36:LEN(A$))) !'ファイル名
      IF POS(FILENAME$(N),"?")>0 THEN LET N=N-1 !'文字化け
   END IF
LOOP
CLOSE #1
FILE DELETE TMP$
END SUB

EXTERNAL SUB COMPARE(N,PATH$,NAME$(),DA$(),TI$(),M,PATH2$,NAME2$(),DA2$(),TI2$())
OPEN #2:NAME BAT$
SET #2:POINTER END
FOR I=1 TO N
   LET FL=0
   FOR J=1 TO M
      IF UCASE$(NAME$(I))=UCASE$(NAME2$(J)) THEN
         LET FL=1
         IF DA$(I)>DA2$(J) OR (DA$(I)=DA2$(J) AND TI$(I)>TI2$(J)) THEN !'ファイルが更新されている
            PRINT #2:"COPY /Y ";CHR$(34);PATH$;"\";NAME$(I);CHR$(34);" ";CHR$(34);PATH2$;"\";NAME2$(J);CHR$(34)
         END IF
         EXIT FOR
      END IF
   NEXT J
   IF FL=0 THEN PRINT #2:"COPY ";CHR$(34);PATH$;"\";NAME$(I);CHR$(34);" ";CHR$(34);PATH2$;"\";NAME$(I);CHR$(34) !'ファイルが存在しない
NEXT I
CLOSE #2
END SUB

EXTERNAL FUNCTION BEFORESTRING$(A$,B$)
LET N=POS(A$,B$)
IF N=0 THEN
   LET BEFORESTRING$=A$
ELSE
   LET BEFORESTRING$=LEFT$(A$,N-1)
END IF
END FUNCTION

EXTERNAL FUNCTION AFTERSTRING$(A$,B$)
LET N=POS(A$,B$)
IF N=0 THEN
   LET AFTERSTRING$=A$
ELSE
   LET AFTERSTRING$=RIGHT$(A$,LEN(A$)-LEN(B$)-N+1)
END IF
END FUNCTION
 

戻る