// This example uses zip but standard library // also supports tar archives package main import ( "archive/zip" "log" "os" ) func main() { // 建立一个打包文件 outFile, err := os.Create("test.zip") if err != nil { log.Fatal(err) } defer outFile.Close() // 建立zip writer zipWriter := zip.NewWriter(outFile) // 往打包文件中写文件。 // 这里咱们使用硬编码的内容,你能够遍历一个文件夹,把文件夹下的文件以及它们的内容写入到这个打包文件中。 var filesToArchive = []struct { Name, Body string } { {"test.txt", "String contents of file"}, {"test2.txt", "\x61\x62\x63\n"}, } // 下面将要打包的内容写入到打包文件中,依次写入。 for _, file := range filesToArchive { fileWriter, err := zipWriter.Create(file.Name) if err != nil { log.Fatal(err) } _, err = fileWriter.Write([]byte(file.Body)) if err != nil { log.Fatal(err) } } // 清理 err = zipWriter.Close() if err != nil { log.Fatal(err) } }
// This example uses zip but standard library // also supports tar archives package main import ( "archive/zip" "log" "io" "os" "path/filepath" ) func main() { zipReader, err := zip.OpenReader("test.zip") if err != nil { log.Fatal(err) } defer zipReader.Close() // 遍历打包文件中的每一文件/文件夹 for _, file := range zipReader.Reader.File { // 打包文件中的文件就像普通的一个文件对象同样 zippedFile, err := file.Open() if err != nil { log.Fatal(err) } defer zippedFile.Close() // 指定抽取的文件名。 // 你能够指定全路径名或者一个前缀,这样能够把它们放在不一样的文件夹中。 // 咱们这个例子使用打包文件中相同的文件名。 targetDir := "./" extractedFilePath := filepath.Join( targetDir, file.Name, ) // 抽取项目或者建立文件夹 if file.FileInfo().IsDir() { // 建立文件夹并设置一样的权限 log.Println("Creating directory:", extractedFilePath) os.MkdirAll(extractedFilePath, file.Mode()) } else { //抽取正常的文件 log.Println("Extracting file:", file.Name) outputFile, err := os.OpenFile( extractedFilePath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, file.Mode(), ) if err != nil { log.Fatal(err) } defer outputFile.Close() // 经过io.Copy简洁地复制文件内容 _, err = io.Copy(outputFile, zippedFile) if err != nil { log.Fatal(err) } } } }
// 这个例子中使用gzip压缩格式,标准库还支持zlib, bz2, flate, lzw package main import ( "os" "compress/gzip" "log" ) func main() { outputFile, err := os.Create("test.txt.gz") if err != nil { log.Fatal(err) } gzipWriter := gzip.NewWriter(outputFile) defer gzipWriter.Close() // 当咱们写如到gizp writer数据时,它会依次压缩数据并写入到底层的文件中。 // 咱们没必要关心它是如何压缩的,仍是像普通的writer同样操做便可。 _, err = gzipWriter.Write([]byte("Gophers rule!\n")) if err != nil { log.Fatal(err) } log.Println("Compressed data written to file.") }
// 这个例子中使用gzip压缩格式,标准库还支持zlib, bz2, flate, lzw package main import ( "compress/gzip" "log" "io" "os" ) func main() { // 打开一个gzip文件。 // 文件是一个reader,可是咱们可使用各类数据源,好比web服务器返回的gzipped内容, // 它的内容不是一个文件,而是一个内存流 gzipFile, err := os.Open("test.txt.gz") if err != nil { log.Fatal(err) } gzipReader, err := gzip.NewReader(gzipFile) if err != nil { log.Fatal(err) } defer gzipReader.Close() // 解压缩到一个writer,它是一个file writer outfileWriter, err := os.Create("unzipped.txt") if err != nil { log.Fatal(err) } defer outfileWriter.Close() // 复制内容 _, err = io.Copy(outfileWriter, gzipReader) if err != nil { log.Fatal(err) } }
ioutil提供了两个函数: TempDir() 和 TempFile()。
使用完毕后,调用者负责删除这些临时文件和文件夹。
有一点好处就是当你传递一个空字符串做为文件夹名的时候,它会在操做系统的临时文件夹中建立这些项目(/tmp on Linux)。
os.TempDir()返回当前操做系统的临时文件夹。
package main import ( "os" "io/ioutil" "log" "fmt" ) func main() { // 在系统临时文件夹中建立一个临时文件夹 tempDirPath, err := ioutil.TempDir("", "myTempDir") if err != nil { log.Fatal(err) } fmt.Println("Temp dir created:", tempDirPath) // 在临时文件夹中建立临时文件 tempFile, err := ioutil.TempFile(tempDirPath, "myTempFile.txt") if err != nil { log.Fatal(err) } fmt.Println("Temp file created:", tempFile.Name()) // ... 作一些操做 ... // 关闭文件 err = tempFile.Close() if err != nil { log.Fatal(err) } // 删除咱们建立的资源 err = os.Remove(tempFile.Name()) if err != nil { log.Fatal(err) } err = os.Remove(tempDirPath) if err != nil { log.Fatal(err) } }
package main import ( "os" "io" "log" "net/http" ) func main() { newFile, err := os.Create("devdungeon.html") if err != nil { log.Fatal(err) } defer newFile.Close() url := "http://www.devdungeon.com/archive" response, err := http.Get(url) defer response.Body.Close() // 将HTTP response Body中的内容写入到文件 // Body知足reader接口,所以咱们可使用ioutil.Copy numBytesWritten, err := io.Copy(newFile, response.Body) if err != nil { log.Fatal(err) } log.Printf("Downloaded %d byte file.\n", numBytesWritten) }
package main import ( "crypto/md5" "crypto/sha1" "crypto/sha256" "crypto/sha512" "log" "fmt" "io/ioutil" ) func main() { // 获得文件内容 data, err := ioutil.ReadFile("test.txt") if err != nil { log.Fatal(err) } // 计算Hash fmt.Printf("Md5: %x\n\n", md5.Sum(data)) fmt.Printf("Sha1: %x\n\n", sha1.Sum(data)) fmt.Printf("Sha256: %x\n\n", sha256.Sum256(data)) fmt.Printf("Sha512: %x\n\n", sha512.Sum512(data)) }
上面的例子复制整个文件内容到内存中,传递给hash函数。
另外一个方式是建立一个hash writer, 使用Write、WriteString、Copy将数据传给它。
下面的例子使用 md5 hash,但你可使用其它的Writer。html
package main import ( "crypto/md5" "log" "fmt" "io" "os" ) func main() { file, err := os.Open("test.txt") if err != nil { log.Fatal(err) } defer file.Close() //建立一个新的hasher,知足writer接口 hasher := md5.New() _, err = io.Copy(hasher, file) if err != nil { log.Fatal(err) } // 计算hash并打印结果。 // 传递 nil 做为参数,由于咱们不通参数传递数据,而是经过writer接口。 sum := hasher.Sum(nil) fmt.Printf("Md5 checksum: %x\n", sum) }