// Write a single file to TarGz func TarGzWrite(item ArchiveItem, tw *tar.Writer, fi os.FileInfo) (err error) { if item.FileSystemPath != "" { fr, err := os.Open(item.FileSystemPath) if err == nil { defer fr.Close() h := new(tar.Header) h.Name = item.ArchivePath h.Size = fi.Size() h.Mode = int64(fi.Mode()) h.ModTime = fi.ModTime() err = tw.WriteHeader(h) if err == nil { _, err = io.Copy(tw, fr) } } } else { h := new(tar.Header) //backslash-only paths h.Name = strings.Replace(item.ArchivePath, "\\", "/", -1) h.Size = int64(len(item.Data)) h.Mode = int64(0644) //? is this ok? h.ModTime = time.Now() err = tw.WriteHeader(h) if err == nil { _, err = tw.Write(item.Data) } } return err }
func TestUntarCreatesDeeperPathsIfNotMentioned(t *testing.T) { StartTest(t) defer FinishTest(t) // create a buffer and tar.Writer buffer := bytes.NewBufferString("") archive := tar.NewWriter(buffer) writeFile := func(name, contents string) { b := []byte(contents) header := new(tar.Header) header.Name = name header.Typeflag = tar.TypeReg header.Mode = 0644 header.Mode |= c_ISREG header.ModTime = time.Now() header.Size = int64(len(b)) TestExpectSuccess(t, archive.WriteHeader(header)) _, err := archive.Write(b) TestExpectSuccess(t, err) TestExpectSuccess(t, archive.Flush()) } // generate the mock tar... this will write to a file in a directory that // isn't already created within the tar writeFile("./a_directory/file", "foo") archive.Close() // create temp folder to extract to tempDir := TempDir(t) extractionPath := path.Join(tempDir, "pkg") err := os.MkdirAll(extractionPath, 0755) TestExpectSuccess(t, err) // extract r := bytes.NewReader(buffer.Bytes()) u := NewUntar(r, extractionPath) u.AbsoluteRoot = tempDir TestExpectSuccess(t, u.Extract()) fileExists := func(name string) { _, err := os.Stat(path.Join(tempDir, name)) TestExpectSuccess(t, err) } fileContents := func(name, contents string) { b, err := ioutil.ReadFile(path.Join(tempDir, name)) TestExpectSuccess(t, err) TestEqual(t, string(b), contents) } fileExists("./pkg/a_directory/file") fileContents("./pkg/a_directory/file", "foo") }
// Deal with files func tarGzFile(srcFile string, recPath string, tw *tar.Writer, fi os.FileInfo) error { //转换字符集 recPath = Utf8ToGBK(recPath) if fi.IsDir() { // Create tar header hdr := new(tar.Header) // if last character of header name is '/' it also can be directory // but if you don't set Typeflag, error will occur when you untargz hdr.Name = recPath + "/" hdr.Typeflag = tar.TypeDir hdr.Size = 0 //hdr.Mode = 0755 | c_ISDIR hdr.Mode = int64(fi.Mode()) hdr.ModTime = fi.ModTime() // Write hander err := tw.WriteHeader(hdr) return err } else { // File reader fr, err := os.Open(srcFile) if err != nil { return err } defer fr.Close() // Create tar header hdr := new(tar.Header) hdr.Name = recPath hdr.Size = fi.Size() hdr.Mode = int64(fi.Mode()) hdr.ModTime = fi.ModTime() // Write hander err = tw.WriteHeader(hdr) if err != nil { return err } // Write file data _, err = io.Copy(tw, fr) return err } }
func (overlayWhiteoutConverter) ConvertWrite(hdr *tar.Header, path string, fi os.FileInfo) error { // convert whiteouts to AUFS format if fi.Mode()&os.ModeCharDevice != 0 && hdr.Devmajor == 0 && hdr.Devminor == 0 { // we just rename the file and make it normal hdr.Name = WhiteoutPrefix + hdr.Name hdr.Mode = 0600 hdr.Typeflag = tar.TypeReg } if fi.Mode()&os.ModeDir != 0 { // convert opaque dirs to AUFS format by writing an empty file with the prefix opaque, err := system.Lgetxattr(path, "trusted.overlay.opaque") if err != nil { return err } if opaque != nil && len(opaque) == 1 && opaque[0] == 'y' { // create a header for the whiteout file // it should inherit some properties from the parent, but be a regular file *hdr = tar.Header{ Typeflag: tar.TypeReg, Mode: hdr.Mode & int64(os.ModePerm), Name: filepath.Join(hdr.Name, WhiteoutOpaqueDir), Size: 0, Uid: hdr.Uid, Uname: hdr.Uname, Gid: hdr.Gid, Gname: hdr.Gname, AccessTime: hdr.AccessTime, ChangeTime: hdr.ChangeTime, } } } return nil }
func (t *Tarball) addFile(file *File) error { // grab a handle on the file to read it into the buffer fr, err := os.Open(file.path) if err != nil { return err } defer fr.Close() if stat, err := fr.Stat(); err == nil { // create the tarball header for this file header := new(tar.Header) header.Name = file.path header.Size = stat.Size() header.Mode = int64(stat.Mode()) header.ModTime = stat.ModTime() // write the header to the current tarball if err := t.tw.WriteHeader(header); err != nil { return err } // copy the file data over now that the header is set if _, err := io.Copy(t.tw, fr); err == nil { t.size += stat.Size() } else { return err } } else { return err } return nil }
func entar(w io.Writer, dir string, ww io.Writer) error { msg.Write(ww, msg.User, []byte("entar\n")) tw := tar.NewWriter(w) err := filepath.Walk(dir, func(path string, fi os.FileInfo, err error) error { if err != nil { return err } hdr := new(tar.Header) hdr.Name = "./app" + path[len(dir):] hdr.Mode = int64(fi.Mode() & os.ModePerm) if fi.IsDir() { hdr.Typeflag = tar.TypeDir } else { hdr.Typeflag = tar.TypeReg hdr.Size = fi.Size() } if err = tw.WriteHeader(hdr); err != nil { return err } if !fi.IsDir() { var f *os.File f, err = os.Open(path) if err != nil { return err } _, err = io.Copy(tw, f) } return err }) if err != nil { return err } return tw.Close() }
func addFileToArchive(filePath string, addPath string, tarWriter *tar.Writer, fileInfo os.FileInfo) error { addPath = filepath.ToSlash(addPath) if isSymlink(fileInfo) { link, err := filepath.EvalSymlinks(filePath) if err != nil { return err } filePath = link fileInfo, err = os.Lstat(filePath) if err != nil { return err } } header := new(tar.Header) header.Name = addPath header.Size = fileInfo.Size() header.Mode = int64(fileInfo.Mode()) header.ModTime = fileInfo.ModTime() fileReader, err := os.Open(filePath) if err != nil { return err } defer fileReader.Close() err = tarWriter.WriteHeader(header) fail.Handle(err) _, err = io.Copy(tarWriter, fileReader) return err }
func sparseCompress() { err := os.Mkdir("sparse", 0777) tarfile, err := os.Create("sparse/sparse.tar") if err != nil { log.Fatalln(err) } defer tarfile.Close() var fileWriter io.WriteCloser = tarfile tfw := tar.NewWriter(fileWriter) defer tfw.Close() file, err := os.Open("sparse.img") defer file.Close() fileInfo, err := file.Stat() header := new(tar.Header) header.Name = file.Name() header.Size = fileInfo.Size() header.Mode = int64(fileInfo.Mode()) header.ModTime = fileInfo.ModTime() header.Typeflag = tar.TypeGNUSparse err = tfw.WriteHeader(header) if err != nil { log.Fatalln(err) } _, err = io.Copy(tfw, file) if err != nil { log.Fatalln(err) } }
// Writes the given file into tarfn func writeItem(tarfn string, fn string) (pos uint64, err error) { pos = 0 sfh, err := os.Open(fn) defer sfh.Close() if sfi, err := sfh.Stat(); err == nil { hdr := new(tar.Header) hdr.Name = sfi.Name() hdr.Size = sfi.Size() hdr.Mode = int64(sfi.Mode().Perm()) hdr.ModTime = sfi.ModTime() var ( tw *tar.Writer f ReadWriteSeekCloser ) if tw, f, pos, err = OpenForAppend(tarfn); err == nil { defer f.Close() defer tw.Close() //LIFO if err := tw.WriteHeader(hdr); err == nil { if zw, err := gzip.NewWriterLevel(tw, flate.BestCompression); err == nil { defer zw.Close() _, err = io.Copy(zw, sfh) } } } } return }
func writeTarGz(filePath, baseDir string, tarGzWriter *tar.Writer, fileInfo os.FileInfo) error { file, err := os.Open(filePath) if err != nil { return err } defer file.Close() relativePath, err := filepath.Rel(baseDir, filePath) if err != nil { return err } header := new(tar.Header) header.Name = relativePath header.Size = fileInfo.Size() header.Mode = int64(fileInfo.Mode()) header.ModTime = fileInfo.ModTime() err = tarGzWriter.WriteHeader(header) if err != nil { return err } _, err = io.Copy(tarGzWriter, file) if err != nil { return err } return nil }
// Write the files into the tar dir func writeTar(path string, tw *tar.Writer, fi os.FileInfo) error { fr, err := os.Open(path) if err != nil { return err } defer fr.Close() h := new(tar.Header) h.Name = fi.Name() h.Size = fi.Size() h.Mode = int64(fi.Mode()) h.ModTime = fi.ModTime() err = tw.WriteHeader(h) if err != nil { return err } _, err = io.Copy(tw, fr) if err != nil { return err } return err }
// file name filelist is like this: './source/file' func TarFilelist(filelist []string, case_dir string, object_name string) (tar_url string) { tar_url = path.Join(case_dir, object_name) + ".tar.gz" fw, err := os.Create(tar_url) if err != nil { fmt.Println("Failed in create tar file ", err) return tar_url } defer fw.Close() gw := gzip.NewWriter(fw) defer gw.Close() tw := tar.NewWriter(gw) defer tw.Close() for index := 0; index < len(filelist); index++ { source_file := filelist[index] fi, err := os.Stat(path.Join(case_dir, source_file)) if err != nil { fmt.Println(err) continue } fr, err := os.Open(path.Join(case_dir, source_file)) if err != nil { fmt.Println(err) continue } h := new(tar.Header) h.Name = source_file h.Size = fi.Size() h.Mode = int64(fi.Mode()) h.ModTime = fi.ModTime() err = tw.WriteHeader(h) _, err = io.Copy(tw, fr) } return tar_url }
func addFile(path string, fileInfo os.FileInfo, tarFileWriter *tar.Writer) error { if fileInfo.IsDir() { return nil } file, err := os.Open(path) if err != nil { return err } defer file.Close() header := new(tar.Header) header.Name = file.Name() header.Size = fileInfo.Size() header.Mode = int64(fileInfo.Mode()) header.ModTime = fileInfo.ModTime() err = tarFileWriter.WriteHeader(header) if err != nil { return err } _, err = io.Copy(tarFileWriter, file) if err != nil { return err } return nil }
func (c AdminData) Download(createdTime string) revel.Result { backup, ok := configService.GetBackup(createdTime) if !ok { return c.RenderText("") } dbname, _ := revel.Config.String("db.dbname") path := backup["path"] + "/" + dbname allFiles := ListDir(path) filename := "backup_" + dbname + "_" + backup["createdTime"] + ".tar.gz" // file write fw, err := os.Create(revel.BasePath + "/files/" + filename) if err != nil { return c.RenderText("") } // defer fw.Close() // 不需要关闭, 还要读取给用户下载 // gzip write gw := gzip.NewWriter(fw) defer gw.Close() // tar write tw := tar.NewWriter(gw) defer tw.Close() // 遍历文件列表 for _, file := range allFiles { fn := path + "/" + file fr, err := os.Open(fn) fileInfo, _ := fr.Stat() if err != nil { return c.RenderText("") } defer fr.Close() // 信息头 h := new(tar.Header) h.Name = file h.Size = fileInfo.Size() h.Mode = int64(fileInfo.Mode()) h.ModTime = fileInfo.ModTime() // 写信息头 err = tw.WriteHeader(h) if err != nil { panic(err) } // 写文件 _, err = io.Copy(tw, fr) if err != nil { panic(err) } } // for return c.RenderBinary(fw, filename, revel.Attachment, time.Now()) // revel.Attachm }
func MakeTarball(tarname string, fnames []string) error { log.Printf("tarring %d entrires to %s ...", len(fnames), tarname) tarfile, err := os.Create(tarname) if err != nil { return err } defer tarfile.Close() var tarwriter *tar.Writer if strings.HasSuffix(tarname, ".gz") { zipper := gzip.NewWriter(tarfile) defer zipper.Close() tarwriter = tar.NewWriter(zipper) /* } else if strings.HasSuffix(tarname, ".xz") { p := xz.WriterDefaults p.DictCap = 1 << 24 zipper, err := xz.NewWriterParams(tarfile, &p) //xz.NewWriter(tarfile) if err != nil { return err } defer zipper.Close() tarwriter = tar.NewWriter(zipper) */ } else { tarwriter = tar.NewWriter(tarfile) } defer tarwriter.Close() for _, fname := range fnames { realm, ts, good := util.Parse_FName(fname) if !good { log.Printf("warning: skip ill-named file '%s'", fname) continue // skip } data, err := util.Load(fname) if err != nil { return err } hdr := new(tar.Header) hdr.Name = util.Make_FName(realm, ts, false) hdr.Size = int64(len(data)) hdr.ModTime = ts hdr.Mode = 0644 err = tarwriter.WriteHeader(hdr) if err != nil { return err } log.Printf("tar %d bytes for file %s", hdr.Size, hdr.Name) _, err = tarwriter.Write(data) if err != nil { return err } } log.Printf("%s tarred without errors", tarname) return nil }
// Deal with files func tarGzFile(srcFile string, recPath string, tw *tar.Writer, fi os.FileInfo) { if fi.IsDir() { // Create tar header hdr := new(tar.Header) hdr.Name = recPath + "/" hdr.Typeflag = tar.TypeDir hdr.Size = 0 //hdr.Mode = 0755 | c_ISDIR hdr.Mode = int64(fi.Mode()) hdr.ModTime = fi.ModTime() // Write hander err := tw.WriteHeader(hdr) if err != nil { panic(err) } } else { // File reader fr, err := os.Open(srcFile) if err != nil { panic(err) } defer fr.Close() // Create tar header hdr := new(tar.Header) hdr.Name = recPath hdr.Size = fi.Size() hdr.Mode = int64(fi.Mode()) hdr.ModTime = fi.ModTime() // Write hander err = tw.WriteHeader(hdr) if err != nil { panic(err) } // Write file data _, err = io.Copy(tw, fr) if err != nil { panic(err) } } }
func TarCompress(source, target string) error { fw, err := os.Create(target) if err != nil { return err } defer fw.Close() // gzip write gw := gzip.NewWriter(fw) defer gw.Close() // tar write tw := tar.NewWriter(gw) defer tw.Close() dir, err := os.Open(source) if err != nil { return err } defer dir.Close() fis, err := dir.Readdir(0) if err != nil { return err } for _, fi := range fis { if fi.IsDir() { continue } fmt.Println(fi.Name()) fr, err := os.Open(dir.Name() + "/" + fi.Name()) if err != nil { return err } defer fr.Close() h := new(tar.Header) h.Name = fi.Name() h.Size = fi.Size() h.Mode = int64(fi.Mode()) h.ModTime = fi.ModTime() err = tw.WriteHeader(h) if err != nil { return err } _, err = io.Copy(tw, fr) if err != nil { return err } } return nil }
func (t *Tar) ChanTar() { defer sendBoolChan(t.CloseDone, true) fw, err := os.Create(t.Dest) if err != nil { return } defer fw.Close() // if t.Gz { t.Gw = gzip.NewWriter(fw) defer t.Gw.Close() t.Tw = tar.NewWriter(t.Gw) // } defer t.Tw.Close() dir, err := os.Open(t.OriPath) if err != nil { return } defer dir.Close() t.Prepare.Done() for { var done bool = false select { case content := <-t.Ch: header := new(tar.Header) header.Name = content.FileName header.Size = int64(len(content.Text)) header.Mode = content.Mode if year, _, _ := content.ModTime.Date(); year == 1 { header.ModTime = time.Now() } if err := t.Tw.WriteHeader(header); err != nil { // todo error fmt.Println(err.Error()) return // break } if _, err := t.Tw.Write(content.Text); err != nil { fmt.Println(err.Error()) return // break } t.Job.Done() case <-t.JobDone: done = true break } if done { break } } return }
func writeHosts(tw *tar.Writer) error { etcheader := tar.Header{} etcheader.Name = "rootfs/etc/" etcheader.Mode = 0644 etcheader.Typeflag = tar.TypeDir tw.WriteHeader(&etcheader) content := []byte("127.0.0.1 localhost\n::1 localhost\n") header := tar.Header{} header.Name = "rootfs/etc/hosts" header.Mode = 0644 header.Typeflag = tar.TypeReg header.Size = int64(len(content)) tw.WriteHeader(&header) if _, err := tw.Write(content); err != nil { return fmt.Errorf("cannot write manifest: %v", err) } return nil }
func addAllFile(dirPath string, tw *tar.Writer) { //打开文件夹 dir, err := os.Open(dirPath) if err != nil { panic(err) } defer dir.Close() //读取文件列表 fis, err := dir.Readdir(0) //n<=0 读取所有 n>0 读取n个 if err != nil { panic(err) } //遍历文件列表 for _, fi := range fis { if fi.IsDir() { addAllFile(dirPath+fi.Name()+"/", tw) continue } //打印文件名称 fmt.Println(dirPath + fi.Name()) //打开文件 fr, err := os.Open(dir.Name() + "/" + fi.Name()) if err != nil { panic(err) } defer fr.Close() //信息头 h := new(tar.Header) h.Name = dirPath + fi.Name() h.Size = fi.Size() h.Mode = int64(fi.Mode()) h.ModTime = fi.ModTime() //写信息头 err = tw.WriteHeader(h) if err != nil { panic(err) } //写文件 _, err = io.Copy(tw, fr) if err != nil { panic(err) } } }
// Pack tar and gzip files func Pack(gzPath, dirPath string, pathMap map[string]int) error { fw, err := os.Create(gzPath) if err != nil { return err } defer fw.Close() gw := gzip.NewWriter(fw) defer gw.Close() tw := tar.NewWriter(gw) defer tw.Close() for path, val := range pathMap { if val < 0 { continue } f, err := os.Stat(filepath.Join(dirPath, path)) if err != nil { continue } if f.IsDir() { continue } fr, err := os.Open(filepath.Join(dirPath, path)) if err != nil { return err } defer fr.Close() h := new(tar.Header) h.Name = path h.Size = f.Size() h.Mode = int64(f.Mode()) h.ModTime = f.ModTime() err = tw.WriteHeader(h) if err != nil { return err } _, err = io.Copy(tw, fr) if err != nil { return err } } return nil }
// WriteHeader changes the mode of files and directories inline as a tarfile is // being written func (a ChmodAdapter) WriteHeader(hdr *tar.Header) error { if hdr.FileInfo().Mode()&os.ModeSymlink == 0 { newMode := hdr.Mode &^ 0777 if hdr.FileInfo().IsDir() { newMode |= a.NewDirMode } else if hdr.FileInfo().Mode()&0010 != 0 { // S_IXUSR newMode |= a.NewExecFileMode } else { newMode |= a.NewFileMode } hdr.Mode = newMode } return a.Writer.WriteHeader(hdr) }
// Deal with files func tarGzFile(srcFile string, recPath string, tw *tar.Writer, fi os.FileInfo) { if fi.IsDir() { // fmt.Println("??") // Create tar header hdr := new(tar.Header) // if last character of header name is '/' it also can be directory // but if you don't set Typeflag, error will occur when you untargz hdr.Name = recPath // + "/" // fmt.Println(hdr.Name) hdr.Typeflag = tar.TypeDir // hdr.Size = 0 //hdr.Mode = 0755 | c_ISDIR // hdr.Mode = int64(fi.Mode()) // 加这个会有错误!!! // hdr.ModTime = fi.ModTime() // 加这个会有错误!! // Write hander err := tw.WriteHeader(hdr) if err != nil { panic(err) } } else { // File reader fr, err := os.Open(srcFile) if err != nil { panic(err) } defer fr.Close() // Create tar header hdr := new(tar.Header) hdr.Name = recPath // fmt.Println(hdr.Name) hdr.Size = fi.Size() hdr.Mode = int64(fi.Mode()) hdr.ModTime = fi.ModTime() // Write hander err = tw.WriteHeader(hdr) if err != nil { panic(err) } // Write file data _, err = io.Copy(tw, fr) if err != nil { panic(err) } } }
func writeTarEntry(tw *tar.Writer, name string, data []byte) error { h := new(tar.Header) h.Name = name h.Uid = 1000 h.Gid = 1000 h.Mode = 0755 h.Size = int64(len(data)) if err := tw.WriteHeader(h); err != nil { return err } if _, err := tw.Write(data); err != nil { return err } return nil }
func writeManifest(tw *tar.Writer, manifest map[string]interface{}) error { buf, err := json.Marshal(manifest) if err != nil { return fmt.Errorf("cannot serialize manifest: %v", err) } header := tar.Header{} header.Name = "manifest" header.Mode = 0644 header.Size = int64(len(buf)) header.Typeflag = tar.TypeReg tw.WriteHeader(&header) if _, err := tw.Write(buf); err != nil { return fmt.Errorf("cannot write manifest: %v", err) } return nil }
// file name filelist is like this: './source/file' func TarFileList(filelist []string, caseDir string, objectName string) (tarURL string, found bool) { logrus.Debugf("Tar file %v in %v", filelist, caseDir) tarURL = path.Join(caseDir, objectName) + ".tar.gz" fw, err := os.Create(tarURL) if err != nil { logrus.Warn(err) return tarURL, false } defer fw.Close() gw := gzip.NewWriter(fw) defer gw.Close() tw := tar.NewWriter(gw) defer tw.Close() found = false for index := 0; index < len(filelist); index++ { sourceFile := filelist[index] logrus.Debugf("Tar file %v", sourceFile) if len(sourceFile) == 0 { logrus.Debugf("empty sourceFile found") continue } fi, err := os.Stat(path.Join(caseDir, sourceFile)) if err != nil { logrus.Warn(err) continue } fr, err := os.Open(path.Join(caseDir, sourceFile)) if err != nil { logrus.Warn(err) continue } h := new(tar.Header) h.Name = sourceFile h.Size = fi.Size() h.Mode = int64(fi.Mode()) h.ModTime = fi.ModTime() err = tw.WriteHeader(h) _, err = io.Copy(tw, fr) found = true } if !found { os.Remove(tarURL) } return tarURL, found }
func tarFile(path string, tw *tar.Writer, fi os.FileInfo) { fr, err := os.Open(path) handleErr(err) defer fr.Close() hdr := new(tar.Header) hdr.Name = path hdr.Size = fi.Size() hdr.Mode = int64(fi.Mode()) hdr.ModTime = fi.ModTime() err = tw.WriteHeader(hdr) handleErr(err) _, err = io.Copy(tw, fr) handleErr(err) return }
// WriteToTarStream writes a byte array of data into a tar stream func WriteToTarStream(stream *tar.Writer, data []byte, header tar.Header) error { if header.Mode == 0 { header.Mode = 0644 } if header.Size == 0 { header.Size = int64(len(data)) } if header.Typeflag == 0 { header.Typeflag = tar.TypeReg } if err := stream.WriteHeader(&header); err != nil { return err } if _, err := stream.Write(data); err != nil { return err } return nil }
func TarGzWrite(_path string, tw *tar.Writer, fi os.FileInfo) { fr, err := os.Open(_path) handleError(err) defer fr.Close() h := new(tar.Header) h.Name = _path[len(ChallengesPath+"/"):] h.Size = fi.Size() h.Mode = int64(fi.Mode()) h.ModTime = fi.ModTime() h.Typeflag = tar.TypeReg err = tw.WriteHeader(h) handleError(err) _, err = io.Copy(tw, fr) handleError(err) }
func tarGzip(target io.Writer, path string) { gw := gzip.NewWriter(target) defer gw.Close() tw := tar.NewWriter(gw) defer tw.Close() tarFile := func(_path string, tw *tar.Writer, fi os.FileInfo) { fr, err := os.Open(_path) assert(err) defer fr.Close() h := new(tar.Header) h.Name = _path[len(path):] h.Size = fi.Size() h.Mode = int64(fi.Mode()) h.ModTime = fi.ModTime() err = tw.WriteHeader(h) assert(err) _, err = io.Copy(tw, fr) assert(err) } tarDir(path, tw, tarFile) }