**【结论】**def 不要在for循环,或者是无限循环代码块中使用
案例:监控文件删除行为,并做文件恢复(基础版)
特点:无限循环执行
if event.Op&fsnotify.Remove == fsnotify.Remove {
for _, site := range sites {
file, err := os.OpenFile(event.Name, os.O_CREATE|os.O_WRONLY, 0666)
if err != nil {
Logger.Printf("|-Err 文件创建失败,报错信息: %v", err)
} else {
Logger.Printf("|-文件创建成功: %v", event.Name)
// 写入文件内容
// ...
def file.Close() // 手动关闭文件句柄
}
}
}
因为 defer 语句在函数结束时才会执行,而不是在每次循环结束时执行,又因为这段函数是一直在运行中的,所以是不会自动断开句柄的,导致每次恢复一个文件,就出现句柄未释放的问题,
后面调整为手动释放,即可在每次循环结束时显式关闭文件句柄。
file, err := os.OpenFile(event.Name, os.O_CREATE|os.O_WRONLY, 0666)
if err != nil {
Logger.Printf("|-Err 文件创建失败,报错信息: %v", err)
} else {
Logger.Printf("|-文件创建成功: %v", event.Name)
// 写入文件内容
// ...
err = file.Close() // 手动关闭文件句柄
if err != nil {
Logger.Printf("|-Err 文件关闭失败,报错信息: %v", err)
} else {
Logger.Printf("|-文件关闭成功: %v", event.Name)
}
}
详细的参考文献:https://blog.youkuaiyun.com/micl200110041/article/details/82116440