GO zip.NewWriter () создание пустых zip-архивов - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть следующая функция, которую я пытался упростить, просто добавив один файл в ZIP-архив.

Что бы я ни пытался, в результирующем файле .zip нет файлов, перечисленных в нем.Размер архива правильный.Но когда я пытаюсь извлечь все (windows), архив пуст.

go версия go1.10.1 windows / amd64

func Zip(src string, dst string) error {
    destinationFile, err := os.Create(dst)
    if err != nil {
        return err
    }
    myZip := zip.NewWriter(destinationFile)
    file := `C:\MA\testing\cldeploy-local.json`
    zipFile, err := myZip.Create(file)

    fsFile, err := os.Open(file)
    if err != nil {
        return err
    }
    _, err = io.Copy(zipFile, fsFile)
    if err != nil {
        return err
    }
    return nil

    if err != nil {
        return err
    }
    err = myZip.Close()
    if err != nil {
        return err
    }
    return nil
}

Когда я извлекаю файл, появляется сообщение об ошибке:сжатая (заархивированная) папка ... неверна.

1 Ответ

0 голосов
/ 05 апреля 2019

Как ответил @JimB: файл должен быть добавлен как относительный путь только косые черты. не может начинаться с косой черты

func Zip(src string, dst string) error {
    destinationFile, err := os.Create(dst)
    if err != nil {
        return err
    }
    myZip := zip.NewWriter(destinationFile)
    file := `C:\MA\testing\cldeploy-local.json`

        // file needs to be added as relative path
        // only forward slashes. can not start with slash
        relPath := strings.TrimPrefix(file, filepath.Dir(src))
        relPath = strings.Replace(relPath, `\`, `/`, -1)
        relPath = strings.TrimLeft(relPath, `/`)

    zipFile, err := myZip.Create(relPath)

    fsFile, err := os.Open(file)
    if err != nil {
        return err
    }
    _, err = io.Copy(zipFile, fsFile)
    if err != nil {
        return err
    }
    return nil

    if err != nil {
        return err
    }
    err = myZip.Close()
    if err != nil {
        return err
    }
    return nil
}
...