编程语言:GO最新版本
我正在处理一个程序A,它需要将日志(log)文件归档到一个目录中,但不包括由使用它进行日志(log)记录的程序B打开的那个目录.打开的文件将在特定持续时间后关闭,比方说24小时,然后可用于存档.显然,这两个程序都是独立运行的.
目前的实现不判断文件是否在程序B中打开,因为我最近发现它正在存档打开的日志(log)文件,我假设它不会这样做;基本上它将文件复制到存档中并删除它.
What would be a reliable way to check if a file is currently opened by another Go program before attempting to archive it?个
我已经编写了归档程序,但我不会在这里发布它,因为问题没有相关的代码,所以我只添加了执行归档和删除的代码.
我已经try 了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
}