How to edit only specific bytes of a file instead of rewriting the entire file

WBOY
Release: 2024-02-09 13:36:09
forward
1166 people have browsed it

How to edit only specific bytes of a file instead of rewriting the entire file

In programming, we often need to edit and modify files. However, sometimes we only need to modify specific bytes in a file rather than rewriting the entire file. This issue is particularly important for applications that need to process large files or that need to process files efficiently. So, how do you achieve editing only specific bytes of a file? In this article, PHP editor Xinyi will introduce you to the solution to this problem in detail.

Question content

I want to create a single file database for storing bytes that emulates how our file system works on a hard drive so that I can write to the database Instead of editing specific bytes while reading (changed or saved by the user) write the entire file to memory, change a few bytes and rewrite the database file back to disk.

How can I use a file handler to change specific bytes in a file without requiring me to load the entire database into memory, make the changes (which does not change the entire file size), and then store it back.

I've tried searching for my query but can't get the answer I'm looking for. I've tried using different modes to open the file handler and maybe give it a try.

Solution

Try using 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)
    }
}
Copy after login

The above is the detailed content of How to edit only specific bytes of a file instead of rewriting the entire file. For more information, please follow other related articles on the PHP Chinese website!

source:stackoverflow.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!