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 サイトの他の関連記事を参照してください。