Recursive zipping of Directories in Windows

Jim jscrerar at compuserve.com
Tue Feb 6 17:10:19 EST 2007


On Feb 6, 2:47 pm, "MRAB" <goo... at mrabarnett.plus.com> wrote:
> On Feb 6, 1:48 am, "joshbl... at gmail.com" <joshbl... at gmail.com> wrote:
>
>
>
> > On Feb 4, 12:42 pm, "Jandre" <jandre_b... at yahoo.co.uk> wrote:
>
> > > On Feb 1, 9:39 pm, Larry Bates <larry.ba... at websafe.com> wrote:
>
> > > > Jandre wrote:
> > > > > Hi
>
> > > > > I am a python novice and I am trying to write a python script (most of
> > > > > the code is borrowed) to Zip a directory containing some other
> > > > > directories and files. The script zips all the files fine but when it
> > > > > tries to zip one of the directories it fails with the following
> > > > > error:
> > > > > "IOError: [Errno 13] Permission denied: 'c:\\aaa\\temp'"
>
> > > > > The script I am using is:
>
> > > > > import zipfile, os
>
> > > > > def toZip( directory, zipFile ):
> > > > >     """Sample for storing directory to a ZipFile"""
> > > > >     z = zipfile.ZipFile(
> > > > >         zipFile, 'w', compression=zipfile.ZIP_DEFLATED
> > > > >     )
> > > > >     def walker( zip, directory, files, root=directory ):
> > > > >         for file in files:
> > > > >             file = os.path.join( directory, file )
> > > > >             # yes, the +1 is hacky...
> > > > >             archiveName = file[len(os.path.commonprefix( (root,
> > > > > file) ))+1:]
> > > > >             zip.write( file, archiveName, zipfile.ZIP_DEFLATED )
> > > > >             print file
> > > > >     os.path.walk( directory, walker, z  )
> > > > >     z.close()
> > > > >     return zipFile
>
> > > > > if __name__ == "__main__":
> > > > >     toZip( 'c:\\aaa', 'c:\\aaa\\test.zip' )
>
> > > > > I have tried to set the permissions on the folder, but when I check
> > > > > the directory permissions it is set back to "Read Only"
>
> > > > > Any suggestions?
>
> > > > > Thanks
> > > > > Johan Balt
>
> > > > Couple of quick suggestions that may help:
>
> > > > 1) don't use 'file' as a variable name. It will mask
> > > > the builtin file function.  If it hasn't bitten you before
> > > > it will if you keep doing that.
>
> > > > 2) If you put the target .zip file in the directory you are
> > > > backing what do you expect the program to do when it comes
> > > > to the file you are creating as you walk the directory?  You
> > > > haven't done anything to 'skip' it.
>
> > > > 3) Your commonprefix and +1 appears to result in same
> > > > information that the easier to use os.path.basename()
> > > > would give you.  Double check me on that.
>
> > > > I don't see anything that references C:\\aaa\temp in your
> > > > code.  Does it exist on your hard drive?  If so does it
> > > > maybe contain temp files that are open?  zipfile module
> > > > can't handle open files.  You must use try/except to
> > > > catch these errors.
>
> > > > Hope info helps.
>
> > > > -Larry
>
> > > Thank you Larry.
> > > I've changed the code as epr your advice. The code is now:
>
> > > import zipfile, os
>
> > > def toZip( directory, zipFile ):
> > >     """Sample for storing directory to a ZipFile"""
> > >     z = zipfile.ZipFile(
> > >         zipFile, 'w', compression=zipfile.ZIP_DEFLATED
> > >     )
> > >     def walker( zip, directory, files, root=directory ):
> > >         for f in files:
> > >             f = os.path.join( directory, f )
> > >             archiveName = os.path.basename(f)
> > >             zip.write( f, archiveName, zipfile.ZIP_DEFLATED )
> > >             print f
> > >     os.path.walk( directory, walker, z  )
> > >     z.close()
> > >     return zipFile
>
> > > if __name__ == "__main__":
> > >     toZip( 'c:\\aaa\\', 'c:\\bbb\\test.zip' )
>
> > > I still get the same error:
> > > Traceback (most recent call last):
> > >   File "C:\Python24\Lib\site-packages\pythonwin\pywin\framework
> > > \scriptutils.py", line 310, in RunScript
> > >     exec codeObject in __main__.__dict__
> > >   File "C:\Python24\Scripts\dirZip.py", line 20, in ?
> > >     toZip( 'c:\\aaa\\', 'c:\\bbb\\test.zip' )
> > >   File "C:\Python24\Scripts\dirZip.py", line 14, in toZip
> > >     os.path.walk( directory, walker, z  )
> > >   File "C:\Python24\lib\ntpath.py", line 329, in walk
> > >     func(arg, top, names)
> > >   File "C:\Python24\Scripts\dirZip.py", line 12, in walker
> > >     zip.write( f, archiveName, zipfile.ZIP_DEFLATED )
> > >   File "C:\Python24\lib\zipfile.py", line 405, in write
> > >     fp = open(filename, "rb")
> > > IOError: [Errno 13] Permission denied: 'c:\\aaa\\temp'
>
> > > c:\\aaa\\temp is a directory in the directory I an trying to zip. I
> > > want to use this script to back up my work once a day and would like
> > > to
> > > keep the directory structure as is. I can zip the files in c:\aaa\tem
> > > fine so I guess that there aren't any open files in the directory.
> > > Any more ideas?
>
> > Hi Jandre,
>
> > Your code is treating the directory as a file and trying to open it
> > and read its bytes to zip them. You'll need to differentiate between
> > files and directories.
>
> > You'll need to check out the Zip module to see how it expects files
> > that should be nested within folders. I believe you'll need to set the
> > archive name for the nested files to something like \\temp\\file.ext
> > etc.
>
> In my experience, zip files don't contain nested folders, instead they
> contain a 'flat' list of files. Files in subfolders are represented by
> relative path names containing slashes and empty subfolders are
> represented by relative paths ending in a slash,.for example
> "File1.txt", "Folder1/File2.dat", "Folder2/Folder3/". This seems to
> work for me! :-)- Hide quoted text -
>
> - Show quoted text -

What's the matter with PKZIP?  It's been around forever.




More information about the Python-list mailing list