2016-09-28 11 views
6

में दाखिल करने के लिए ज़िप फ़ाइल लिख रहा ज़िप करने के लिए एक विधि है:Clojure

(defn zip-project [project-id notebooks files] 
    (with-open [out (ByteArrayOutputStream.) 
       zip (ZipOutputStream. out)] 
    (doseq [nb notebooks] 
     (.putNextEntry zip (ZipEntry. (str "Notebooks/" (:notebook/name nb) ".bkr"))) 
     (let [nb-json (:notebook/contents nb) 
      bytes (.getBytes nb-json)] 
     (.write zip bytes)) 
     (.closeEntry zip)) 
    (doseq [{:keys [name content]} files] 
     (.putNextEntry zip (ZipEntry. (str "Files/" name))) 
     (io/copy content zip) 
     (.closeEntry zip)) 
    (.finish zip) 
    (.toByteArray out))) 

के बाद मैं एक ज़िप मैं इसे /tmp/sample/sample.zip की तरह फ़ाइल कुछ में सहेजना चाहते हैं, लेकिन मैं इसे बनाने के लिए प्रतीत नहीं कर सकते हैं। यह कहना है कि ज़िप फ़ाइल खाली है,

(defn create-file! [path zip] 
    (let [f (io/file path)] 
    (io/make-parents f) 
    (io/copy zip f) 
    true)) 

समस्या है जब मैं टर्मिनल से unzip चलाने के लिए और अगर मैं इसे आर्काइव सुविधा का उपयोग अनज़िप यह cpgz विस्तार के साथ निकालता है: यहाँ मैं क्या कर रहा हूँ है।

मैं यहाँ क्या गलत कर रहा हूं?

+0

मेरे कूबड़ समस्या यह है कि यह है कि आप .toByteArray बाहर फोन '(है) (। toByteArray out) ''ओपन-ओपन' के अंदर 'कुछ बाइट्स अभी भी ZipOutpu में unflushed हो सकता है tStream। तो आप बल्कि '(.toyteArray (खुले [...] ... बाहर) के लिए प्रतिक्रिया देंगे) '। – cgrand

+0

जब मैं '(create-file! "/tmp/sample/sample.zip चलाता हूं" (ज़िप-प्रोजेक्ट 1 [{: नोटबुक/नाम "हैलो": नोटबुक/सामग्री "yadada"}] [{: name "name" : सामग्री "सामग्री"}])) 'फ़ाइल'/tmp/sample/sample.zip' बनाई गई है। जब मैं इसे अनजिप करता हूं तो मुझे सामग्री के रूप में "yadada" फ़ाइल के साथ 'Hello.bkr' फ़ाइल' के साथ एक फ़ोल्डर 'नोटबुक' दिखाई देता है। तो उन डमी मूल्यों के लिए यह मेरी मशीन पर ठीक काम करता है। आप 'नोटबुक' और 'फाइल' क्या करते हैं जो आप 'ज़िप-प्रोजेक्ट' पर जाते हैं? क्या आप उन्हें प्रश्न में जोड़ सकते हैं? –

उत्तर

1

आप अनिवार्य रूप से 4 बातें

  1. आयात सब कुछ की आवश्यकता होगी (सामान्य रूप से आप (ns ...) का प्रयोग करेंगे, लेकिन आप repl

    (import 'java.io.FileOutputStream) 
    (import 'java.io.BufferedOutputStream) 
    (import 'java.io.ZipOutputStream) 
    (import 'java.util.zip.ZipOutputStream) 
    (import 'java.util.zip.ZipEntry) 
    
  2. आप धारा प्रारंभ करने में एक तरह से की जरूरत है इस चला सकते हैं। यह -> मैक्रो के साथ अच्छी तरह से किया जा सकता है:

    (defn zip-stream 
        "Opens a ZipOutputStream over the given file (as a string)" 
        [file] 
        (-> (FileOutputStream. file) 
         BufferedOutputStream. 
         ZipOutputStream.)) 
    
  3. आप बनाने के लिए ZipOutputStream

    (defn create-zip-entry 
        "Create a zip entry with the given name. That will be the name of the file inside the zipped file." 
        [stream entry-name] 
        (.putNextEntry stream (ZipEntry. entry-name))) 
    
  4. में/बंद प्रविष्टियों कोई तरीका होना चाहिए अंत में आप एक तरह से अपनी सामग्री लिखने के लिए की जरूरत है।

    (defn write-to-zip 
        "Writes a string to a zip stream as created by zip-stream" 
        [stream str] 
        (.write stream (.getBytes str))) 
    
  5. यह सबको एक साथ रखें:

    (with-open [stream (zip-stream "coolio.zip")] 
        (create-zip-entry stream "foo1.txt") 
        (write-to-zip stream "Hello Foo1") 
        (.closeEntry stream) ;; don't forget to close entries 
        (create-zip-entry stream "foo2.txt") 
        (write-to-zip stream "Hello Foo 2") 
        (.closeEntry stream)) 
    
  6. परिणाम:

The result

+0

मुझे स्वरूपण सही नहीं लगता है, अगर कोई मुझे हाथ दे सकता है तो सराहना होगी :) – fernandohur