def坑点:文件句柄未能正常释放

**【结论】**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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值