Go 언어는 강력한 프로그래밍 언어이지만 파일 작업을 처리할 때 몇 가지 문제가 발생할 수 있습니다. 특히, 프로그램 A가 파일을 열 때 프로그램 B는 파일을 보관하거나 삭제하려고 시도할 수 있으며 이로 인해 프로그램 A에 오류가 발생할 수 있습니다. 여기에서 PHP 편집기 Xigua는 프로그램 B가 현재 프로그램 A에서 열려 있는 파일을 Go 언어로 작동하지 못하도록 방지하여 프로그램의 안정적인 작동을 보장하는 데 도움이 되는 몇 가지 방법을 제공합니다. 다음은 몇 가지 해결 방법입니다.
프로그래밍 언어: 최신 버전을 사용하세요
저는 로그 파일을 디렉터리에 보관해야 하는 프로그램 A를 작업 중입니다. 단, 로깅에 사용하는 프로그램 B에서 연 로그 파일은 제외됩니다. 열려 있는 파일은 특정 기간(예: 24시간)이 지나면 닫히고 보관이 가능해집니다. 분명히 두 프로그램은 독립적으로 실행됩니다.
현재 구현에서는 프로그램 B의 파일이 열려 있는지 확인하지 않으며 최근에 열린 로그 파일을 보관하고 있다는 것을 발견했기 때문에 기본적으로는 그렇게 하지 않는 것 같습니다. 파일을 아카이브에 복사하고 삭제합니다. .
파일을 보관하기 전에 현재 다른 Go 프로그램에서 열려 있는지 확인하는 신뢰할 수 있는 방법은 무엇입니까?
아카이버를 작성해 놓았으나 질문에 해당되지 않는 코드가 없어서 여기에는 올리지 않고, 아카이빙과 삭제를 수행하는 코드만 추가하겠습니다.
Open 및 OpenFile 기능을 사용해 보았으나 성공하지 못했습니다.
func zipFile(filename string) error { file, err := os.Open(filename) if err != nil { return err } defer func(file *os.File) { err = file.Close() if err != nil { fmt.Println(err) } }(file) fileInfo, err := file.Stat() if err != nil { return err } archiveFile, err := os.Create(fmt.Sprintf("%s.zip", filename)) if err != nil { return err } defer func(archiveFile *os.File) { err = archiveFile.Close() if err != nil { fmt.Println(err) } }(archiveFile) zipWriter := zip.NewWriter(archiveFile) if err != nil { return err } defer func(zipWriter *zip.Writer) { err = zipWriter.Close() if err != nil { fmt.Println(err) } }(zipWriter) writer, err := zipWriter.Create(fileInfo.Name()) if err != nil { return err } _, err = io.Copy(writer, file) if err != nil { return err } err = os.Remove(filename) if err != nil { return err } fmt.Println(fmt.Sprintf("file %s was zipped", fileInfo.Name())) return nil }
프로세스에 관계없이 파일이 다른 프로세스에 의해 열려 있는지 여부를 아는 문제는 기본 운영 체제에 따라 크게 달라집니다. 따라서 이 질문에 대답할 수 있는 보편적인 크로스 플랫폼 방법은 없습니다. *NIX 시스템(Unix, Linux, macOS)의 경우 질문에 답하는 가장 좋은 방법은 핵심 유틸리티 lsof
("열린 파일 목록")를 사용하는 것입니다.
macOS에서는 다음과 같습니다:
으아악또는 다음과 같이 이를 추상화하는 라이브러리를 찾을 수 있습니다. https://github.com/wheel-complex/lsof
lsof
에 대한 추가 정보: https://www.php.cn/link/fa2246fa0fdf0d3e270c86767b77ba1b
위 내용은 프로그램 B가 현재 Go에서 프로그램 A에 의해 열려 있는 파일을 보관/삭제하는 것을 방지하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!