golang 檔案操作之三

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

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/...

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.