在程式設計中,我們經常需要對檔案進行編輯和修改。然而,有時候我們只需要修改文件中的特定字節,而不是重寫整個文件。這個問題對於需要處理大型文件或需要高效處理文件的應用程式來說尤其重要。那麼,如何實現僅編輯文件的特定位元組呢?在本文中,php小編新一將為您詳細介紹這個問題的解決方案。
我想建立一個用於儲存位元組的單一檔案資料庫,該資料庫模擬我們的檔案系統在硬碟上的工作方式,以便我能夠在寫入資料庫而不是讀取時編輯特定位元組(由用戶更改或保存)將整個文件寫入內存,更改幾個位元組並將資料庫文件重寫回磁碟。
如何使用檔案處理程序更改檔案中的特定字節,而不需要我將整個資料庫載入到記憶體中,進行更改(這不會更改整個檔案的大小),然後將其儲存回來。
我已嘗試搜尋我的查詢,但無法獲得我正在尋找的答案。我嘗試過使用不同的模式來開啟文件處理程序,也許還可以嘗試。
嘗試使用WriteAt:
package main import ( "fmt" "log" "os" ) const fileName = "test.txt" func createFile(filename string) error { f, err := os.OpenFile(filename, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) if err != nil { return fmt.Errorf("cannot create file: %v", err) } defer f.Close() if _, err := f.Write([]byte("Hello, World!")); err != nil { return fmt.Errorf("cannot write data to file: %v", err) } return nil } func changeFileByte(filename string, b []byte, pos int64) error { f, err := os.OpenFile(filename, os.O_WRONLY, 0644) if err != nil { return fmt.Errorf("cannot open file: %v", err) } defer f.Close() if _, err := f.WriteAt(b, pos); err != nil { return fmt.Errorf("cannot write to file: %v", err) } return nil } func printFile(filename string) error { content, err := os.ReadFile(filename) if err != nil { return fmt.Errorf("cannot read file: %v", err) } fmt.Printf("%s\n", content) return nil } func main() { if err := createFile(fileName); err != nil { log.Fatal(err) } if err := printFile(fileName); err != nil { log.Fatal(err) } if err := changeFileByte(fileName, []byte{'.'}, 12); err != nil { log.Fatal(err) } if err := printFile(fileName); err != nil { log.Fatal(err) } }
以上是如何僅編輯文件的特定位元組而不是重寫整個文件的詳細內容。更多資訊請關注PHP中文網其他相關文章!