github.com/olegpolukhin/zip@v0.0.0-20201006091701-57ca7a5ed0f6/archiver_test.go (about) 1 package zip 2 3 import ( 4 "bufio" 5 "bytes" 6 "fmt" 7 "io" 8 "log" 9 "os" 10 "strconv" 11 "syscall" 12 "testing" 13 "time" 14 ) 15 16 func timespecToTime(ts syscall.Timespec) time.Time { 17 18 return time.Unix(int64(ts.Sec), int64(ts.Nsec)) 19 } 20 21 func saveArchiveProtectedToStorage(Filename, path, id, password, format string) error { 22 // get last modified time 23 file, err := os.Stat(Filename) 24 if err != nil { 25 fmt.Println(err) 26 } 27 28 fileFd, err := os.Open(Filename) 29 30 if err != nil { 31 return fmt.Errorf("read file error %s", err.Error()) 32 } 33 defer fileFd.Close() 34 // Создаем папку для файла 35 36 errorChdir := os.Chdir(path) 37 if errorChdir != nil { 38 return fmt.Errorf("Chdir error %s", errorChdir.Error()) 39 } 40 41 errFolder := os.Mkdir(id, os.ModePerm) 42 if errFolder != nil { 43 return fmt.Errorf("Create direcory error %s", errFolder.Error()) 44 } 45 46 // Заходим в созданный каталог 47 errorChdir = os.Chdir(id) 48 if errorChdir != nil { 49 return fmt.Errorf("Chdir error %s", errorChdir.Error()) 50 } 51 52 defer fileFd.Close() 53 54 // читаем в буфер 55 buffer := bytes.NewBuffer(make([]byte, 0)) 56 bufferReader := make([]byte, 1024) 57 for { 58 n, err := fileFd.Read(bufferReader) 59 if err != nil && err != io.EOF { 60 return fmt.Errorf("read file error %s", err.Error()) 61 } 62 if n == 0 { 63 break 64 } 65 66 buffer.Write(bufferReader[:n]) 67 } 68 69 // Пишем в защищенный архив 70 raw := new(bytes.Buffer) 71 zipWriter := NewWriter(raw) 72 w, err := zipWriter.Encrypt(Filename, password, AES256Encryption, 0x800, file.ModTime()) 73 if err != nil { 74 return fmt.Errorf("encrypt error %s", err.Error()) 75 } 76 77 _, err = io.Copy(w, bytes.NewReader(buffer.Bytes())) 78 if err != nil { 79 return fmt.Errorf("cope new reader error %s", err.Error()) 80 } 81 82 if err := zipWriter.Close(); err != nil { 83 return fmt.Errorf("zip close error %s", err.Error()) 84 } 85 86 // Создаём защищенный архив 87 fo, err := os.Create(Filename + format) 88 if err != nil { 89 return fmt.Errorf("create archive '%s' error %s", Filename+format, err.Error()) 90 } 91 92 // close fo on exit and check for its returned error 93 defer func() { 94 if err := fo.Close(); err != nil { 95 panic(err) 96 } 97 }() 98 99 // make a write buffer 100 writer := bufio.NewWriter(fo) 101 102 // make a buffer to keep chunks that are read 103 buf := make([]byte, 1024) 104 r := bytes.NewReader(raw.Bytes()) 105 for { 106 // read a chunk 107 n, err := r.Read(buf) 108 if err != nil && err != io.EOF { 109 return fmt.Errorf("read buffer error %s", err.Error()) 110 } 111 if n == 0 { 112 break 113 } 114 115 // write a chunk 116 if _, err := writer.Write(buf[:n]); err != nil { 117 return fmt.Errorf("writer error %s", err.Error()) 118 } 119 } 120 121 if err = writer.Flush(); err != nil { 122 return fmt.Errorf("writer flush error %s", err.Error()) 123 } 124 125 return nil 126 } 127 128 func TestArchive(t *testing.T) { 129 id := strconv.FormatInt(time.Now().Unix(), 9) 130 name := "Teams - (имя файла на русском языке!) (1).txt" 131 log.Println(">>> ", id) 132 133 err := saveArchiveProtectedToStorage(name, "attach", id, "password", ".zip") 134 if err != nil { 135 t.Error(err) 136 } 137 138 }