%
REM Questa parte non dovrebbe mai essere tolta:
REM Midori folderSync v0.1
REM Questo script è da considerarsi DI PUBBLICO DOMINIO.
REM Qualsiasi modifica ed uso sono ammessi,
REM senza la necessità di nessun permesso.
REM L'autore, per di più semianonimo,
REM non è da ritenersi responsabile
REM dell'uso che si faccia di tale script,
REM che è potenzialmente molto pericoloso
REM se non si comprende esattamente il suo scopo.
REM
REM Per qualsiasi informazione contattare:
REM Midori, folderSync@paipai.net
REM Sorgenti disponibili presso:
REM http://www.paipai.net/texts/folderSync01.txt
%>
<%
REM
REM Descrizione:
REM Lo script permette di:
REM Copiare dei files da un folder sorgente ad uno destinatario.
REM Nel caso in cui i files nel folder destinatario esistano già,
REM lo script confronta le date di modifica e la dimensione dei files
REM e sovrascrive i files nel folder destinatario
REM solo se queste differiscono.
REM Sincronizzare due folder, facendo in modo che
REM la struttura del folder 1 diventi identica alla
REM struttura del folder 2.
REM
REM Se le due funzioni vengono usare in sequenza,
REM si ha come risultato due folder identici,
REM sia in contenuto che in struttura.
REM Pertanto esiste una terza subrutine che richiama
REM in sequenza le altre due.
REM
REM Esempio di uso in sequenza:
REM Scopo: Rendere "c:\Dati" identica a "d:\backups\c\Dati"
REM
REM backup "c:\Dati" , "d:\backups\c\Dati"
REM sync "d:\backups\c\Dati", "c:\Dati"
REM notare che gli argomenti sono invertiti in sync rispetto a backup
REM Lo stesso lavoro viene fatto da:
REM BackUpAndSync "c:\Dati" , "d:\backups\c\Dati"
REM
REM esempio d'uso di backup() da solo:
REM scopo: aggiornare il backup con gli ultimi files inseriti/modificati
REM
REM backup "c:\Dati" , "d:\backups\c\Dati"
%>
<%
REM NOTE:
REM Ci sono un paio di problemini: I percorsi di rete non sono
REM validi folder (ES: \\server\share);
REM non si riesce mappare un percorso di rete
REM (che risolverebbe il di cui sopra problema)
REM Le funzioni di debug e log sono fatte, adesso
REM sta a voi inserirle dove piu' vi fa comodo.
REM Trasformare questo script da ASP a VBS eseguibile
REM da Windows Scripting non dovrebbe essere
REM troppo difficile e lo faro' io stesso a breve.
REM Al momento c'e' una netta differenziazione
REM tra sorgente e destinazione. I files non vengono mai copiati
REM da destinazione a sorgente anche se in destinazione
REM ci fossero dei files piu' nuovi di quelli in sorgente.
%>
<%
dim DODEBUG, DOLOG, LOGFILE, LogFileHandle
DODEBUG = false
DOLOG = false
LOGFILE = "c:\folderSync.log"
if DOLOG then
set fsObj = CreateObject("Scripting.FileSystemObject")
if fsObj.FileExists(LOGFILE) then
LogFileHandle = fsObj.getFile(LOGFILE)
else
fsObj.CreateTextFile LOGFILE, true
LogFileHandle = fsObj.getFile(LOGFILE)
end if
end if
sub DEBUG(debugMessage)
if DODEBUG then response.write("DEBUG: " & debugMessage & "
" & vbNewLine)
end sub
sub LOG(logLine,FileHandle)
if DOLOG then
dim ts
set ts = FileHandle.OpenAsTextStream(ForAppending)
ts.WriteLine(logLine)
end if
end sub
REM *********************************************************************
REM * *
REM * restituisce vero se i files differiscono in data oppure dimensione*
REM * *
REM *********************************************************************
function isDifferent(file1,file2)
dim result, fs
result = true
Set fs = CreateObject("Scripting.FileSystemObject")
if fs.FileExists(file1) AND fs.FileExists(file2) then
if fs.GetFile(file1).DateLastModified <> fs.GetFile(file2).DateLastModified then
result = true
else
if fs.GetFile(file1).Size <> fs.GetFile(file2).Size then
result = true
else
result = false
end if
end if
end if
set fs = nothing
isDifferent = result
end function
REM ***************************************************************
REM * *
REM * copia i files dal folder source al folder dest, ma solo se *
REM *i files sono piu' nuovi. *
REM * la funzione esamina ricorsivamente anche i sub folder *
REM * *
REM ***************************************************************
Sub backup(Source,Dest)
Dim fs, f, SourceFolder
Set fs = CreateObject("Scripting.FileSystemObject")
if fs.FolderExists(Source) then
set SourceFolder = fs.GetFolder(Source)
if NOT fs.FolderExists(Dest) then
SourceFolder.copy Dest,true '' se dest non esiste viene copiata pari pari
DEBUG("Intera directory copiata: " & Source & " -->> " & Dest & "
" & vbnewline)
end if
else
DEBUG("Directory Sorgente " & Source & " inesistente o inaccessibile" & "
" & vbnewline)
exit sub 'source non esiste o e' inaccessibile
end if
' prima copiamo tutti i files
for each f1 in SourceFolder.Files
f1DestPath = fs.BuildPath(dest,f1.name)
if isDifferent(f1.Path,f1DestPath) then
f1.copy f1DestPath,true
end if
next
' poi copiamo tutte le directory.
for each f1 in SourceFolder.subFolders
f1DestPath = fs.BuildPath(dest,f1.name)
if fs.folderExists(f1DestPath) then
backup fs.BuildPath(Source,f1.name), f1DestPath
else
f1.copy f1DestPath,true
end if
next
set fs = nothing
set f = nothing
set sourceFolder = nothing
End Sub
REM *******************************************
REM * *
REM * elimina i files presenti in Folder1 che *
REM *non sono piu' presenti in Folder2 *
REM * *
REM *******************************************
sub sync(Folder1,Folder2)
Dim fs, f, Folder1Folder
Set fs = CreateObject("Scripting.FileSystemObject")
if fs.FolderExists(folder2) AND fs.FolderExists(Folder1) then
set Folder1Folder = fs.GetFolder(Folder1)
else
exit sub
end if
for each f1 in Folder1Folder.Files
f1Folder2Path = fs.BuildPath(Folder2,f1.name)
if NOT fs.FileExists(f1Folder2Path) then
f1.delete true
end if
next
for each f1 in Folder1Folder.subFolders
f1Folder2Path = fs.BuildPath(Folder2,f1.name)
if fs.folderExists(f1Folder2Path) then
sync fs.BuildPath(Folder1,f1.name), f1Folder2Path
else
f1.delete true
end if
next
set fs = nothing
set f = nothing
set folder1Folder = nothing
end sub
Sub BackUpAndSync(Source, Dest)
backup source, dest
sync dest, source
end sub
Sub ShowFileList(folderspec)
Dim fs, f, f1, fc, s
Set fs = CreateObject("Scripting.FileSystemObject")
if fs.folderExists(folderspec) then
Set f = fs.GetFolder(folderspec)
Set fc = f.Files
s = "
FolderSize: " & f.size & "
"
For Each f1 in fc
s = s & f1.path & " " & f1.size & "
"
Next
Set fc = f.subFolders
For Each f1 in fc
s = s & f1.path & " -DIR-" & "
"
Next
response.write s
else
response.write("Folder " & folderspec & " inesistente")
end if
End Sub
%>
<%
sourceFolder = request("s")
destFolder = request("d")
%>
Esempio d'uso di folderSync:
<%if request("vai!") = "vai!" then%> <% REM attualmente lo script non funziona con percorsi di rete (es: "\\server\share") REM quello che segue e' un tentativo (non riuscito) di usare un'altra via per accedere REM a delle risorse di rete (mappatura temporanea in un drive). REM Se a qualcuno venisse in mente un'idea migliore, mi piacerebbe sentirla. 'dim SourceIsnetworkFolder,DestIsnetworkFolder, WshNetwork, SourceMapped, DestMapped 'login = "" 'pass = "" 'SourceMapped = "Z:" 'DestMapped = "X:" 'SourceIsNetworkFolder = false 'DestIsNetworkFolder = false REM riconosce se si tratta di un percorso di rete. 'if instr(sourceFolder,"\\")<>0 then 'SourceIsnetworkFolder = true 'Set WshNetwork = server.CreateObject("Wscript.Network") 'WshNetwork.MapNetworkDrive SourceMapped, sourceFolder, false, login, pass 'end if 'if instr(destFolder,"\\")<>0 then 'DestIsnetworkFolder = true 'Set WshNetwork = server.CreateObject("Wscript.Network") 'WshNetwork.MapNetworkDrive DestMapped, destFolder, false, login, pass 'end if 'if SourceIsnetworkFolder then TempSource = SourceMapped else TempSource = sourceFolder end if 'if DestIsnetworkFolder then TempDest = destMapped else TempDest = destFolder end if %> <% TempSource = sourceFolder tempDest = destFolder %>PRIMA:
---- <%=sourceFolder%> <%if SourceIsnetworkFolder then response.write("-->> Mapped on: " & SourceMapped)%>---- <%ShowFileList(TempSource)%>
---- <%=destFolder%> <%if DestIsnetworkFolder then response.write("-->> Mapped on: " & destMapped)%>---- <%ShowFileList(TempDest)%> <% backup TempSource, TempDest sync TempDest, TempSource %> <% REM rimozione delle mappature di rete. if SourceIsnetworkFolder then Set WshNetwork = server.CreateObject("Wscript.Network") WshNetwork.RemoveNetworkDrive SourceMapped end if if DestIsnetworkFolder then Set WshNetwork = server.CreateObject("Wscript.Network") WshNetwork.RemoveNetworkDrive destMapped end if %>
------------------------------------------------------
DOPO:
---- <%=sourceFolder%> <%if SourceIsnetworkFolder then response.write("-->> Mapped on: " & SourceMapped)%>---- <%ShowFileList(TempSource)%>
---- <%=destFolder%> <%if DestIsnetworkFolder then response.write("-->> Mapped on: " & destMapped)%>---- <%ShowFileList(TempDest)%> <%end if%>