ホームページ > バックエンド開発 > Golang > Go でプログラム A が現在開いているファイルをプログラム B がアーカイブ/削除しないようにするにはどうすればよいですか?

Go でプログラム A が現在開いているファイルをプログラム B がアーカイブ/削除しないようにするにはどうすればよいですか?

王林
リリース: 2024-02-10 23:33:07
転載
737 人が閲覧しました

Go でプログラム A が現在開いているファイルをプログラム B がアーカイブ/削除しないようにするにはどうすればよいですか?

Go 言語は強力なプログラミング言語ですが、ファイル操作を扱うときにいくつかの問題が発生する可能性があります。特に、プログラム A がファイルを開くと、プログラム B がそのファイルをアーカイブまたは削除しようとし、プログラム A でエラーが発生する可能性があります。 PHP エディター Xigua では、プログラム A が Go 言語で現在開いているファイルをプログラム B が操作できないようにして、プログラムの安定した動作を確保するためのいくつかの方法を紹介します。解決策は次のとおりです。

質問の内容

プログラミング言語: 最新バージョンを使用してください

私は、ログ ファイルをディレクトリにアーカイブする必要があるプログラム 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

以上がGo でプログラム A が現在開いているファイルをプログラム B がアーカイブ/削除しないようにするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:stackoverflow.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート