몇 가지 옵션이 있습니다.
1- 파일을 읽고 처리 한 다음 다시 쓰십시오 (해당 파일을 잠 가야 함).
2 바이너리 파일을 사용하고 텍스트 처리 (행 잠금 포함)를 최적화하기 위해 링크 된 목록과 같은 특수 데이터 구조를 고안 (사용)하십시오.
3- 준비 데이터베이스를 사용.
이 3- 파일 내부에 사용하는 가상 파일 시스템을 하나 개의 파일처럼 각각의 라인을 취급, 참조 : https://github.com/lotrfan/vfs 및 https://github.com/blang/vfs (데이터베이스 서버와 같은) 파일 관리자를 사용하여
파일 잠금 딜레마를 해결한다.
파일을 사용하는 목적이 송신자 프로그램이 새로운 행을 추가하는 단방향 통신이고 수신자 프로그램이이를 제거하는 경우 os pipes (명명 된 파이프 (FIFO)) 또는 다른 interop 메소드를 사용하는 것이 좋습니다.
Linux 용 참조 : Windows 용 Unix FIFO in go?
: https://github.com/natefinch/npipe
샘플 파일 작가 :
package main
import (
"bufio"
"fmt"
"os"
"time"
)
func main() {
f, err := os.OpenFile("/tmp/file.txt", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
if err != nil {
panic(err)
}
defer f.Close()
for i := 0; ; i++ {
w := bufio.NewWriter(f)
_, err := fmt.Fprintln(w, i)
if err != nil {
panic(err)
}
w.Flush() // Flush writes any buffered data to the underlying io.Writer.
f.Sync() // commit the current contents of the file to stable storage.
fmt.Println("write", i)
time.Sleep(500 * time.Millisecond)
}
}
샘플 파일 리더 :
package main
import (
"fmt"
"os"
"time"
)
func main() {
f, err := os.OpenFile("/tmp/file.txt", os.O_RDWR, 0666)
if err != nil {
panic(err)
}
defer f.Close()
i := 0
for {
n, err := fmt.Fscanln(f, &i)
if n == 1 {
fmt.Println(i)
}
if err != nil {
fmt.Println(err)
return
}
time.Sleep(500 * time.Millisecond)
}
}
전체 파일을 다시 쓰지 않고도 파일 앞에서 한 줄을 삭제할 수 없습니다. 당신의 sed 예제는 그것의 일을하는 동안 추가 된 줄을 잃는 것과 같은 문제를 가지고 있습니다. 경주는 이전 줄을 처리하는 동안 쓰여졌을 때 줄을 잃어 버렸기 때문에 sed가 작습니다. –
실패로부터 보호하기 위해 줄을 지우는 목적은 무엇입니까? 이 경우 최신 라인이 처리 된 상태 파일을 작성하고 시작할 때 확인한 다음 해당 위치에서 처리를 시작하는 것이 좋습니다. EOF를 누르면 파일을 안전하게 삭제할 수 있습니다. – jxstanford
각 줄을 반복하고 "처리 된"줄을 문자열 변수에 연결 한 다음 문자열 변수의 내용을 사용하여 파일을 다시 씁니다. – openwonk