Go 파일 생성 및 버퍼로 파일 쓰기

os 패키지 - os - pkg.go.dev https://pkg.go.dev/os#OpenFile

os.OpenFile


파일을 작성할 때 세 개의 매개변수가 있는 OpenFile 함수를 사용하십시오. 이 기능은 os 패키지의 기능입니다.

func OpenFile(name string, flag int, perm FileMode) (*File, error)

깃발

설명: os.OpenFile은 보다 일반적인 파일 열기 기능이며 지정된 옵션(예: O_RDONLY 등), 지정된 모드(예: 0666 등)를 사용하여 지정된 이름의 파일을 엽니다. 작업이 성공하면 반환된 파일 개체를 I/O에 사용할 수 있습니다. 오류가 있는 경우 오류의 기본 유형은 *PathError입니다.

첫 번째 매개변수는 파일의 경로이고, 두 번째 매개변수는 읽기 또는 쓰기로 파일을 열지, 추가하거나 비워서 쓸지, 파일이 존재하지 않을 때 등 파일을 여는 동작을 제어하는 ​​것입니다. 만들다. 마지막은 파일 권한입니다.

열린 파일의 식별자는 다음과 같습니다. 이러한 모드는 |로 결합될 수 있습니다. 파일 작업에서는 파일을 생성하는 특별한 기능이 없습니다. 파일을 열면 O_CREAT 모드로 열립니다. 파일이 다음과 같을 경우 열린 파일이 존재하지 않으면 자동으로 새 파일이 생성되며 쓰기 방법과 함께 O_CREAT를 사용하는 경우가 많습니다.

모드 열기는 매우 중요합니다. 예를 들어 syscall.O_TRUNC는 잘못 열리면 문제가 매우 심각합니다. 예를 들어 이런 방식으로 열면 원본 파일이 비게 되므로 열 때 반드시 필요에 따라 열립니다. 

const (
	// Exactly one of O_RDONLY, O_WRONLY, or O_RDWR must be specified.
	O_RDONLY int = syscall.O_RDONLY //  只读模式打开文件
	O_WRONLY int = syscall.O_WRONLY //  只写模式打开文件
	O_RDWR   int = syscall.O_RDWR   //  读写模式打开文件

	O_APPEND int = syscall.O_APPEND //  写操作将文件数据追加到文件尾部
	O_CREATE int = syscall.O_CREAT  //  如果不存在将创建一个新文件
	O_EXCL   int = syscall.O_EXCL   // used with O_CREATE, file must not exist.
	O_SYNC   int = syscall.O_SYNC   // open for synchronous I/O.  同步io
	O_TRUNC  int = syscall.O_TRUNC  // 打开截断文件,也就是清空文件
)


默认情况下是异步io

파일 모드 

이것은 주로 Linux에서 사용되며 Windows 운영 체제에서는 유효하지 않습니다.

*파일, 오류

 파일 핸들로 반환되거나 잘못 열리면 오류 값으로 반환됩니다.

 

 

버퍼로 파일 쓰기


os.OpenFile(), bufio.NewWriter(), *Writer 메서드 WriteString을 사용하여 위 작업을 완료합니다.

시스템이 호출할 때마다 디스크에 있는 파일을 읽는 대신 파일을 작동할 때 캐시가 있습니다. 캐시에 데이터가 있으면 캐시에서 직접 데이터를 읽고, 캐시에 데이터가 없으면 디스크에서 캐시로 로드한 후 읽습니다.

쓰기 중이라면 먼저 캐시에 데이터를 쓰고 캐시가 가득 찼을 때 동기화를 실행하고 캐시에 있는 데이터를 디스크로 출력한다.

func  NewWriter 

여기서는 버퍼링된 라이터를 사용하고 이전에 읽을 때 func (b * Reader ) ReadString(delim byte ) ( string , error )을 사용했으며 버퍼링된 라이터도 제공하므로 캐시 방법을 전달하여 콘텐츠를 쓸 수 있습니다. 파일.

캐시되어 있기 때문에 쓴 내용이 디스크에 저장되지 않고, 플러시 기능을 사용하여 실제로 캐시에 있는 내용을 디스크에 쓸 수 있습니다. 따라서 func (b * Writer ) WriteString(s string ) ( int , error )을 호출하면 내용이 실제로 캐시에 먼저 기록됩니다.

실제로 구조체에 버퍼가 있는 것을 알 수 있는데, 쓸 때 버퍼에 내용을 먼저 쓰기 때문에 버퍼의 내용을 파일에 쓰기 위한 작업 플러시가 있어야 합니다.

type Writer struct {
	err error
	buf []byte
	n   int
	wr  io.Writer
}

fileSd,err := os.OpenFile("test.txt",os.O_CREATE | os.O_WRONLY,os.ModePerm)

	if err != nil {
		fmt.Println("open file error:",err)
		return
	}

	defer fileSd.Close()

	contents := []string{"hello\n","world\n","你好\n","世界\n"}
	writer := bufio.NewWriter(fileSd)

	for _,v := range contents{
		writer.WriteString(v)
	}

	writer.Flush() //内容是先写到缓存对,所以需要调用flush将缓存对数据真正写到文件中
                   //否则文件当中会没有数据

Supongo que te gusta

Origin blog.csdn.net/qq_34556414/article/details/123517517
Recomendado
Clasificación