|
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
|
|