這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
1.打包檔案
// This example uses zip but standard library// also supports tar archivespackage mainimport ( "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) }}
2.unzip
// This example uses zip but standard library// also supports tar archivespackage mainimport ( "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) } } }}
3.壓縮檔
// 這個例子中使用gzip壓縮格式,標準庫還支援zlib, bz2, flate, lzwpackage mainimport ( "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.")}
4.解壓縮檔案
// 這個例子中使用gzip壓縮格式,標準庫還支援zlib, bz2, flate, lzwpackage mainimport ( "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) }}
5.臨時檔案和目錄
ioutil提供了兩個函數: TempDir() 和 TempFile()。
使用完畢後,調用者負責刪除這些臨時檔案和檔案夾。
有一點好處就是當你傳遞一個Null 字元串作為檔案夾名的時候,它會在作業系統的臨時檔案夾中建立這些項目(/tmp on Linux)。
os.TempDir()返回當前作業系統的臨時檔案夾。
package mainimport ( "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) }}
6.通過HTTP下載檔案
package mainimport ( "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)}
7.雜湊和摘要
package mainimport ( "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。
package mainimport ( "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)}
原文:http://colobu.com/2016/10/12/...