# -*- encoding: utf-8 -*- import os,time import zipfile import shutil #SRCDIRの下の日付時刻名ディレクトリを ZIPDIRの下の同名.zipにする。 #処理するHTMLのあるディレクトリ SRCDIR = "..\backup" #ZIPを出力するディレクトリ DSTDIR = "..\tozip" #src_dirで指定されたディレクトリ配下のディレクトリ中のファイルを再帰的に圧縮 #zipファイル名 def zipDirectoryDir( src_dir, zip_name ): zipf = zipfile.ZipFile(zip_name, 'w', zipfile.ZIP_DEFLATED) for rootname, dirnamelist, filenamelist in os.walk(src_dir): for reg_file in filenamelist: write_file = os.path.join( rootname , reg_file) arc_name = write_file print( "ZIP圧縮: "+ write_file) try: zipf.write(write_file, arc_name); except: print( "ERROR: writing file ="+ write_file) zipf.close() #メイン files=os.listdir(SRCDIR) for file in files: try: dirname = os.path.join(SRCDIR,file) zipfilename = os.path.join(DSTDIR,file)+".zip"; if os.path.isdir(dirname): print("ディレクトリなので圧縮 "+dirname) zipDirectoryDir( dirname, zipfilename ) shutil.rmtree(dirname) except: print( "Error="+file ) traceback.print_exc() print( "End" )
うーむ、それらしき大きさのそれらしきzipファイルが作られるのだが、そのZIPはエクスプローラで開くとからっぽ…。
どこかに詰まらないミスがある筈なのだが…。
似た処理の http://qiita.com/suin/items/cdef17e447ceeff6e79d を見ると、
yeild root
という謎の処理が。これが怪しいがyeildって何だろう?pushっぽい事をするものらしい。ZIPファイルの不正には関係なさそうな気が。
自分の方の、
arc_name = write_file zipf.write(write_file, arc_name);
がちょっと怪しい気がしてきたな。write_fileってフルパスなんだよな。
→原因はやはり、arc_nameがフルパスだったこと。arc_nameをパス名を含まないものにして解決(サブディレクトリは無い前提)。
展開時にエラーとなる。ちなみに7-Zipならこの状態でも無理矢理解凍できる。
コメント