从文本文件中删除前N个字节。

huangapple go评论82阅读模式
英文:

delete first N bytes from a text file

问题

在Golang中,可以使用os.Fileio.Copy来删除文本文件的前N个字节。下面是一个示例代码:

package main

import (
	"fmt"
	"io"
	"os"
)

func main() {
	filePath := "path/to/your/file.txt"
	N := 100 // 要删除的字节数

	err := deleteFirstNBytes(filePath, N)
	if err != nil {
		fmt.Println("删除文件字节时出错:", err)
		return
	}

	fmt.Println("成功删除文件的前", N, "个字节")
}

func deleteFirstNBytes(filePath string, N int) error {
	file, err := os.OpenFile(filePath, os.O_RDWR, 0644)
	if err != nil {
		return err
	}
	defer file.Close()

	stat, err := file.Stat()
	if err != nil {
		return err
	}

	if stat.Size() <= int64(N) {
		// 文件大小小于等于N,直接清空文件
		err = file.Truncate(0)
		if err != nil {
			return err
		}
		return nil
	}

	_, err = file.Seek(int64(N), io.SeekStart)
	if err != nil {
		return err
	}

	_, err = io.Copy(file, file)
	if err != nil {
		return err
	}

	err = file.Truncate(stat.Size() - int64(N))
	if err != nil {
		return err
	}

	return nil
}

请将"path/to/your/file.txt"替换为你要操作的文本文件的路径,将N替换为你要删除的字节数。这段代码会打开文件,将文件指针移动到第N个字节处,然后将剩余的内容复制回文件开头,并截断文件尾部,以达到删除前N个字节的目的。

英文:

Is there any function call or simple way to delete first N bytes from a text file in golang? Assuming that the file is contentiously appended by various go-routines, simultaneously I want to delete first N bytes of file.

答案1

得分: 2

你需要使用f.Seek来跳过前面的字节,然后进行常规读取,参考以下示例:

package main

import (
	"fmt"
	"io"
	"io/ioutil"
	"os"
)

func main() {
	f, err := os.Open(os.Args[1])            // 打开命令行参数指定的文件
	if err != nil {
		fmt.Println(err)
		return
	}
    
	var skipBytes int64 = 5                  // 要跳过的字节数

	_, err = f.Seek(skipBytes, io.SeekStart) // 跳过前面的字节
	if err != nil {
		fmt.Println(err)
		return
	}

	buffer := make([]byte, 1024)               // 分配缓冲区进行读取
	for {
		n, err := f.Read(buffer)               // 读取
		fmt.Print(string(buffer[:n]))          // 输出到控制台
		if err != nil {
			fmt.Printf("Err: %v\n", err)
			return
		}
	}
}

希望对你有帮助!

英文:

You need to do f.Seek to jump over first bytes and than do regular reading, see example:

package main
import (
&quot;fmt&quot;
&quot;io&quot;
&quot;io/ioutil&quot;
&quot;os&quot;
)
func main() {
f, err := os.Open(os.Args[1])            // open file from argument
if err != nil {
fmt.Println(err)
return
}
var skipBytes int64 = 5                  // how many bytes to skip
_, err = f.Seek(skipBytes, io.SeekStart) // skipping first bytes
if err != nil {
fmt.Println(err)
return
}
buffer := make([]byte, 1024)               // allocating buffer to read
for {
n, err := f.Read(buffer)               // reading
fmt.Print(string(buffer[:n]))          // writing to console
if err != nil {
fmt.Printf(&quot;Err: %v\n&quot;, err)
return
}
}
}

huangapple
  • 本文由 发表于 2017年6月22日 20:22:24
  • 转载请务必保留本文链接:https://go.coder-hub.com/44699307.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定