AirScout/DotNetZip/Zip/PackResources.vbs

239 wiersze
7.7 KiB
Plaintext

' PackResources.vbs
' ------------------------------------------------------------------
'
' Copyright (c) 2010 Dino Chiesa
' All rights reserved.
'
' This code module is part of DotNetZip, a zipfile class library.
'
' ------------------------------------------------------------------
'
' This code is licensed under the Microsoft Public License.
' See the file License.txt for the license details.
' More info on: http://dotnetzip.codeplex.com
'
' ------------------------------------------------------------------
'
' last saved (in emacs):
' Time-stamp: <2011-July-23 20:02:17>
'
' ------------------------------------------------------------------
'
' This is a script file that packs the resources files into a zip,
' for inclusion into the zip dll.
'
' This script assumes it will be run by Visual Studio, as a prebuild
' script, starting with the current directory of
' {DotNetZip}\Zip Partial DLL\bin\{Debug,Release}
'
' Wed, 10 Feb 2010 12:24
'
' ------------------------------------------------------------------
Sub NewZip(pathToZipFile)
WScript.Echo "Creating a new zip file (" & pathToZipFile & ") "
Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")
Dim file
Set file = fso.CreateTextFile(pathToZipFile)
'' this is the content for an empty zip file
file.Write Chr(80) & Chr(75) & Chr(5) & Chr(6) & String(18, 0)
file.Close
Set fso = Nothing
Set file = Nothing
WScript.Sleep 500
End Sub
Function DatesAreSubstantiallyDifferent(d1, d2)
Dim result
Dim s
''WScript.Echo "d1= " & d1
''WScript.Echo "d2= " & d2
'' http://www.w3schools.com/vbscript/func_datediff.asp
s = DateDiff("s",d1,d2)
''WScript.Echo "s= " & s
'' 2 seconds or less in either direction is ok.
If (s < 3 AND s > -3) Then
result = False
Else
result = True
End If
DatesAreSubstantiallyDifferent = result
End Function
Sub CreateZip(pathToZipFile, dirToZip)
Dim fso
Set fso= Wscript.CreateObject("Scripting.FileSystemObject")
Dim fullPathToZipFile
fullPathToZipFile = fso.GetAbsolutePathName(pathToZipFile)
Dim fullDirToZip
fullDirToZip = fso.GetAbsolutePathName(dirToZip)
If Not fso.FolderExists(fullDirToZip) Then
WScript.Echo "The directory to zip does not exist."
Exit Sub
End If
WScript.Echo "Checking zip " & fullPathToZipFile
WScript.Echo " against directory " & fullDirToZip
dim sa
set sa = CreateObject("Shell.Application")
' http://msdn.microsoft.com/en-us/library/bb787866(VS.85).aspx
' ===============================================================
' 4 = do not display a progress box
' 16 = Respond with "Yes to All" for any dialog box that is displayed.
' 128 = Perform the operation on files only if a wildcard file name (*.*) is specified.
' 256 = Display a progress dialog box but do not show the file names.
' 2048 = Version 4.71. Do not copy the security attributes of the file.
' 4096 = Only operate in the local directory. Don't operate recursively into subdirectories.
Dim fcount
fcount = 0
Dim needRepack
needRepack = -1
Dim zip
Dim folder, file, builtpath, pass, d1, d2, folderItem
Set folder = fso.GetFolder(fullDirToZip)
'' do this in 2 passes. First pass checks if any file in the zip has been updated.
'' 2nd pass is performed only if necessary, and actually copies all the files into the new zip.
pass = 0
Do Until pass > 1
For Each file in folder.Files
'' check or zip any file that is not .zip, not .resx and not ending in ~ (emacs backup file)
If (Right(file.name,4) <> ".zip" AND Right(file.name,5) <> ".resx" AND Right(file.name,1) <> "~") Then
builtpath = fso.BuildPath(fullDirToZip, file.Name)
If (pass = 0) Then
If (needRepack = -1) Then
'' first file only
If Not fso.FileExists(fullPathToZipFile) Then
WScript.Echo "The zip file does not exist."
'' no zip means, always need to repack
needRepack = 1
Else
Set zip = sa.NameSpace(fullPathToZipFile)
needRepack = 0
End If
End If
'' only check if we need to repack this file, if
'' necessary; in other words, if none of the prior
'' files need to be repacked.
If (needRepack = 0) Then
'' check if the file has been updated
d1 = file.DateLastModified
Set folderItem = zip.ParseName(file.Name)
If (Not folderItem Is Nothing) Then
d2 = folderItem.ModifyDate
Set folderItem = Nothing
Else
'' dummy
d2 = "01/01/2001 6:05:00 PM"
End If
If DatesAreSubstantiallyDifferent(d1,d2) Then
needRepack = 1
End If
End If
Else
'' pass = 1
If (fcount = 0) Then
Wscript.Sleep(400)
End If
WScript.Echo builtpath
zip.CopyHere builtpath, 0
fcount = fcount + 1
'' Delay between each item. With no, the zip fails with
'' "file not found" or "No Read Permission" or some other
'' spurious error.
Wscript.Sleep(450)
End If
End If
Next
If (pass = 0) Then
If (needRepack <> 0) Then
'' reaching pass 1 means we delete and re-create the zip file
WScript.Echo "The resources zip needs to be re-packed. "
Set zip = Nothing
If fso.FileExists(fullPathToZipFile) Then
WScript.Echo "That zip file already exists - deleting it."
fso.DeleteFile fullPathToZipFile
'' give it time to be really deleted
Wscript.Sleep(2400)
End If
NewZip fullPathToZipFile
Set zip = sa.NameSpace(fullPathToZipFile)
Else
WScript.Echo "The resources zip does not need to be updated."
'' insure we skip the 2nd pass.
pass = pass + 1
End If
Else
'' the zip process is asynchronous. wait for completion,
'' but don't wait forever.
Dim sLoop
sLoop = 0
WScript.Echo "Verifying the count..."
Do Until fcount <= zip.Items.Count
Wscript.Sleep(400)
sLoop = sLoop + 1
If ((sLoop Mod 6) = 0) Then
WScript.Echo " have " & zip.items.Count & " items so far, need " & fcount
ElseIf sLoop > 80 Then
WScript.Echo "Giving up..."
Set zip = Nothing
Wscript.Sleep(1200)
If fso.FileExists(fullPathToZipFile) Then
fso.DeleteFile fullPathToZipFile
End If
Err.Raise 1460, "PackResources.vbs/CreateZip", "Timeout waiting for ZIP completion"
End If
Loop
End If
pass = pass + 1
Loop
Set fso = Nothing
Set sa = Nothing
Set zip = Nothing
Set folder = Nothing
End Sub
CreateZip "..\..\Resources\zippedResources.zip", "..\..\Resources"