Sample code for 30+ languages & platforms
SQL Server

Set Entry Filepath (in output Zip) when Zipping

Demonstrates how to set the path for the file entry within the .zip to something different than the path in the filesystem.

Chilkat SQL Server Downloads

SQL Server
-- Important: See this note about string length limitations for strings returned by sp_OAMethod calls.
--
CREATE PROCEDURE ChilkatSample
AS
BEGIN
    DECLARE @hr int
    -- Important: Do not use nvarchar(max).  See the warning about using nvarchar(max).
    DECLARE @sTmp0 nvarchar(4000)
    DECLARE @success int
    SELECT @success = 0

    -- This requires the Chilkat Zip API to have been previously unlocked.
    -- See Unlock Chilkat Zip for sample code.

    DECLARE @zip int
    EXEC @hr = sp_OACreate 'Chilkat.Zip', @zip OUT
    IF @hr <> 0
    BEGIN
        PRINT 'Failed to create ActiveX component'
        RETURN
    END

    EXEC sp_OAMethod @zip, 'NewZip', @success OUT, 'qa_output/zipA.zip'

    -- When an absolute filepath is passed to AddFile, the path within the .zip
    -- will be one of two values:  (1) just the filename part if saveExtraPath is 0,
    -- or (2) the full absolute path, but made relative, if saveExtraPath is 1.
    -- (For example, "c:/ck2000/appData/UnitTest/qa_data/hamlet.xml" made relative is 
    -- "ck2000/appData/UnitTest/qa_data/hamlet.xml")
    DECLARE @saveExtraPath int
    SELECT @saveExtraPath = 0
    EXEC sp_OAMethod @zip, 'AddFile', @success OUT, 'c:/ck2000/appData/UnitTest/qa_data/hamlet.xml', @saveExtraPath
    IF @success = 0
      BEGIN
        EXEC sp_OAGetProperty @zip, 'LastErrorText', @sTmp0 OUT
        PRINT @sTmp0
        EXEC @hr = sp_OADestroy @zip
        RETURN
      END

    -- When a relative path is passed to AddFile, then saveExtraPath does not apply.
    -- For example, assume our current working directory is "c:/ck2000/appData/UnitTest".  The following
    -- call to AddFile creates an entry with the filepath "qa_data/hamlet.xml".
    EXEC sp_OAMethod @zip, 'AddFile', @success OUT, 'qa_data/hamlet.xml', @saveExtraPath
    IF @success = 0
      BEGIN
        EXEC sp_OAGetProperty @zip, 'LastErrorText', @sTmp0 OUT
        PRINT @sTmp0
        EXEC @hr = sp_OADestroy @zip
        RETURN
      END

    -- Examine the entries
    DECLARE @entry int
    EXEC @hr = sp_OACreate 'Chilkat.ZipEntry', @entry OUT

    DECLARE @numEntries int
    EXEC sp_OAGetProperty @zip, 'NumEntries', @numEntries OUT
    DECLARE @i int
    SELECT @i = 0
    WHILE @i < @numEntries
      BEGIN
        EXEC sp_OAMethod @zip, 'EntryAt', @success OUT, @i, @entry

        EXEC sp_OAGetProperty @entry, 'FileName', @sTmp0 OUT
        PRINT @i + ': ' + @sTmp0
        SELECT @i = @i + 1
      END

    -- The output so far is:

    -- 	0: hamlet.xml
    -- 	1: qa_data/hamlet.xml

    -- If we write the .zip as-is, then the zip will have two entries
    -- with the filepaths as shown above.

    -- This writes "qa_output/zipA.zip"
    EXEC sp_OAMethod @zip, 'WriteZip', @success OUT

    -- Now change the entry filepaths to whatever is desired.
    EXEC sp_OAMethod @zip, 'EntryOf', @success OUT, 'hamlet.xml', @entry
    IF @success = 0
      BEGIN

        PRINT 'entry not found'
        EXEC @hr = sp_OADestroy @zip
        EXEC @hr = sp_OADestroy @entry
        RETURN
      END

    EXEC sp_OASetProperty @entry, 'FileName', 'Shakespeare/Claudius1.xml'

    EXEC sp_OAMethod @zip, 'EntryOf', @success OUT, 'qa_data/hamlet.xml', @entry
    IF @success = 0
      BEGIN

        PRINT 'entry not found'
        EXEC @hr = sp_OADestroy @zip
        EXEC @hr = sp_OADestroy @entry
        RETURN
      END

    EXEC sp_OASetProperty @entry, 'FileName', 'Shakespeare/Claudius2.xml'

    -- Change the name of the .zip to be written and write again:
    EXEC sp_OASetProperty @zip, 'FileName', 'qa_output/zipB.zip'
    EXEC sp_OAMethod @zip, 'WriteZipAndClose', @success OUT
    IF @success <> 1
      BEGIN
        EXEC sp_OAGetProperty @zip, 'LastErrorText', @sTmp0 OUT
        PRINT @sTmp0
      END
    ELSE
      BEGIN

        PRINT 'Zip created!'
      END

    -- Examine both zipA.zip and zipB.zip using 7zip (or another tool) to see the differences.

    EXEC @hr = sp_OADestroy @zip
    EXEC @hr = sp_OADestroy @entry


END
GO