On Nov 22, 2006, at 9:21 AM, Stephen Barncard wrote:

Hi gang,

I'm messing around with the compress() function.
My goal is to compress an .app package then upload it to an ftp server. Right now the below code works on small files but seems to choke on a 300mb file.

I have a few questions:
1. in order to compress a MacOSX 'package',do I have to devise a 'walker' to identify and compress each file separately inside? yikes.

Compress works with binary data so you can't package a folder directly. For small files like OS X externals I've used the attached routine to store compressed versions of each file along with it's folder in a Rev object. I only use it on known data so if you plan on using it with user supplied information you might need to add some more safety checks.

2. Will the compress function work like this between two files:
put compress(URL tPRE) into URL tPOST ?? I can get it to work for small files now...

I haven't tried this before so no comment.

3. Also after reviewing compress() I think I like the new zip routines better - the progress callbacks are well worth it fo big files.

But there's no revZipFolder command, which is really what I'm looking for. That would really complete the zip library...

You could probably modify the attached handler to work with revZip as it walks through the provided directory using a recursive call. One thing to keep in mind when adding directories is:

1) You can't add a folder to a zip archive with revZip. You have to add a file in a folder. 2) When calling revZipAddItemWithFile and working with folders the 2nd parameter should be the relative path to your file. So if you were compressing the folder "/some folder/folder being compressed" and there was a file "/some folder/folder being compressed/some other folder/some file.txt" then the itemName (2nd) parameter would be "some other folder/some file.txt".


--
Trevor DeVore
Blue Mango Learning Systems - www.bluemangolearning.com
[EMAIL PROTECTED]



/**
* Saves the contents of a folder to a custom property set of an object.
*
* @param pObj long id of object where custom property set will be stored.
* @param  pRoot        Path to root folder.
* @param pFolder folder within root being acted on. Used recursively, don't pass.
*
* @return Empty OR error msg.
*/
ON sys_saveFolderToObj pObj, pRoot, pFolder
    local tDefault,tFiles,tFolders,tFile,tLine
    local e,tError
    IF pFolder is empty THEN put pRoot into pFolder

    TRY
        IF there is a folder pFolder THEN
            put defaultfolder into tDefault
            set defaultfolder to pFolder

            put files() into tFiles
            REPEAT for each line tLine in tFiles
                put pFolder & slash & tLine into tFile
                get offset(pRoot, tFile)
                IF it = 1 THEN delete char 1 to length(pRoot) of tFile
ELSE throw "Folder is not within root folder:" && pFolder & slash & tLine

set the uFolderFiles[tFile] of pObj to compress(URL ("binfile:"& pFolder&slash&tLine))
            END REPEAT

            put folders() into tFolders
            REPEAT for each line tLine in tFolders
                IF tLine = ".." THEN next REPEAT

                put pFolder & slash & tLine into tFile
                get offset(pRoot, tFile)
                IF it = 1 THEN delete char 1 to length(pRoot) of tFile
ELSE throw "Folder is not within root folder:" && pFolder & slash & tLine

set the uFolderFolders[tFile] of pObj to 1 --> STORE LIST OF ALL FOLDERS sys_saveFolderToObj pObj, pRoot, pFolder & slash & tLine
            END REPEAT
        END IF
    CATCH e
        put e into tError
    FINALLY
        set defaultfolder to tDefault
    END TRY

    return tError
END sys_saveFolderToObj


----------
-- Reverse of sys_saveFolderToObj
----------
ON sys_saveObjToFolder pObj, pFolder
    put the filetype into theFileType
    set the filetype to empty

    TRY
        --> CREATE ALL FOLDERS
REPEAT for each line theKey in customkeys["uFolderFolders"] of pObj
            sys_createAllFoldersInPath pFolder & theKey, pFolder
            IF the result is not empty THEN throw the result
        END REPEAT

        --> EXPORT FILES
REPEAT for each line theKey in customkeys["uFolderFiles"] of pObj put decompress(the uFolderFiles[theKey] of pObj) into URL ("binfile:"& pFolder & theKey)
            IF the result is not empty THEN throw the result
        END REPEAT

    CATCH e
        put e into theError
    END TRY

    set the filetype to theFileType

    return theError
END sys_saveObjToFolder


/**
* Creates all folders in a provided path.
*
* @param pPath     Full path to be created.
* @param pRootPath Root folder to start creating from. This is a folder that already exists.
*
* @return Error msg
*/
ON sys_createAllFoldersInPath pPath, pRootPath
    local tChoppedPath  = ""

    set itemdel to slash

    --> VALIDATE pRootPath
    IF pRootPath is empty THEN
        put item 1 to 2 of pPath into pRootPath
    ELSE
IF char 1 to (number of chars of pRootPath) of pPath is not pRootPath THEN
            return "path is not a child of root path"
        END IF

IF last char of pRootPath = slash THEN delete last char of pRootPath
    END IF

    --> MAKE SURE THERE IS WORK TO DO
IF there is not a folder pRootPath THEN return "root path does not exist" IF number of items of pPath <= number of items of pRootPath THEN return empty

put pRootPath & slash & item (number of items of pRootPath + 1) of pPath into tChoppedPath

    IF there is not a folder tChoppedPath THEN
        create folder tChoppedPath
        IF the result is not empty THEN return the result
    END IF

    sys_createAllFoldersInpath pPath, tChoppedPath

    return empty
END sys_createAllFoldersInPath

_______________________________________________
use-revolution mailing list
[email protected]
Please visit this url to subscribe, unsubscribe and manage your subscription 
preferences:
http://lists.runrev.com/mailman/listinfo/use-revolution

Reply via email to