日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

Go語言是一門強大的編程語言,但在處理文件操作時可能會遇到一些問題。特別是當程序A打開一個文件時,程序B可能會嘗試對該文件進行歸檔或刪除,這可能導致程序A出現錯誤。php小編西瓜在這里給出一些方法,幫助您在Go語言中防止程序B對程序A當前打開的文件進行操作,確保程序的穩定運行。下面是一些解決方案:

問題內容

編程語言:使用最新版本

我正在開發一個程序 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),回答問題的最佳方法是使用核心 util lsof(“列出打開的文件”)。

在 macOS 上,看起來像這樣:

package main

import (
    "fmt"
    "os/exec"
    "strings"
)

func main() {
    out, _ := exec.Command("lsof").Output()
    for _, line := range strings.Split(string(out), "\n") {
        // Skip anything that's not a regular file
        if !strings.Contains(line, "REG") { 
            continue
        }

        fields := strings.Fields(line)

        // The macOS lsof command has the filename in the ninth field
        fmt.Println(fields[8])
    }
}

登錄后復制

或者,您可以找到一個對此進行抽象的庫,例如:https://github.com/車輪綜合體/lsof

有關 lsof 的更多信息:https://www.php.cn/link/fa2246fa0fdf0d3e270c86767b77ba1b

分享到:
標簽:Go語言
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定