如何在Go中动态获取文件长度?

我有以下代码片段:


func main() {

    // Some text we want to compress.

    original := "bird and frog"

    

    // Open a file for writing.

    f, _ := os.Create("C:\\programs\\file.gz")

    

    // Create gzip writer.

    w := gzip.NewWriter(f)

    

    // Write bytes in compressed form to the file.

    while ( looping over database cursor) {

       w.Write([]byte(/* the row from the database as obtained from cursor */))

    }

    

    // Close the file.

    w.Close()

    

    fmt.Println("DONE")

}

但是,我想知道一个小的修改。当文件的大小达到某个阈值时,我想关闭它并打开一个新文件。这也是压缩格式。


例如:


假设一个数据库有 10 行,每行 50 字节。


假设压缩因子为2,即1行50字节压缩为25字节。


假设文件大小限制为 50 字节。


这意味着在每 2 条记录之后我应该关闭文件并打开一个新文件。


如何在文件仍然打开并向其写入压缩文件时跟踪文件大小?


富国沪深
浏览 142回答 1
1回答

千巷猫影

gzip.NewWriter需要一个io.Writer。很容易实现io.Writer你想要的定制。例如游乐场type MultiFileWriter struct {    maxLimit      int    currentSize   int    currentWriter io.Writer}func (m *MultiFileWriter) Write(data []byte) (n int, err error) {    if len(data)+m.currentSize > m.maxLimit {        m.currentWriter = createNextFile()    }    m.currentSize += len(data)    return m.currentWriter.Write(data)}注意:您将需要处理一些边缘情况,例如 iflen(data)大于maxLimit. 并且您可能不想跨文件拆分记录。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go