Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk mengedit hanya bait tertentu fail dan bukannya menulis semula keseluruhan fail

Bagaimana untuk mengedit hanya bait tertentu fail dan bukannya menulis semula keseluruhan fail

WBOY
WBOYke hadapan
2024-02-09 13:36:091166semak imbas

Bagaimana untuk mengedit hanya bait tertentu fail dan bukannya menulis semula keseluruhan fail

Dalam pengaturcaraan, kita selalunya perlu mengedit dan mengubah suai fail. Walau bagaimanapun, kadangkala kita hanya perlu mengubah suai bait tertentu dalam fail dan bukannya menulis semula keseluruhan fail. Isu ini amat penting untuk aplikasi yang perlu memproses fail besar atau yang perlu memproses fail dengan cekap. Jadi, bagaimanakah anda mencapai pengeditan hanya bait tertentu bagi fail? Dalam artikel ini, editor PHP Xinyi akan memperkenalkan anda kepada penyelesaian kepada masalah ini secara terperinci.

Kandungan soalan

Saya ingin mencipta pangkalan data fail tunggal untuk menyimpan bait yang meniru cara sistem fail kami berfungsi pada cakera keras supaya saya boleh mengedit perkataan tertentu semasa menulis ke pangkalan data dan bukannya bahagian membaca (diubah atau disimpan oleh pengguna) menulis keseluruhan fail ke memori, menukar beberapa bait dan menulis semula fail pangkalan data kembali ke cakera.

Bagaimana saya boleh menggunakan pengendali fail untuk menukar bait tertentu dalam fail tanpa memerlukan saya memuatkan keseluruhan pangkalan data ke dalam memori, membuat perubahan (yang tidak mengubah saiz keseluruhan fail), dan kemudian menyimpannya semula.

Saya telah cuba mencari pertanyaan saya tetapi tidak dapat jawapan yang saya cari. Saya telah mencuba menggunakan mod yang berbeza untuk membuka pengendali fail dan mungkin mencubanya.

Penyelesaian

Cuba gunakan 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)
    }
}

Atas ialah kandungan terperinci Bagaimana untuk mengedit hanya bait tertentu fail dan bukannya menulis semula keseluruhan fail. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam