>  기사  >  백엔드 개발  >  프로그램 B가 현재 Go에서 프로그램 A에 의해 열려 있는 파일을 보관/삭제하는 것을 방지하는 방법은 무엇입니까?

프로그램 B가 현재 Go에서 프로그램 A에 의해 열려 있는 파일을 보관/삭제하는 것을 방지하는 방법은 무엇입니까?

王林
王林앞으로
2024-02-10 23:33:07716검색

프로그램 B가 현재 Go에서 프로그램 A에 의해 열려 있는 파일을 보관/삭제하는 것을 방지하는 방법은 무엇입니까?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제