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  }