为了账号安全,请及时绑定邮箱和手机立即绑定

在 golang 中重命名之前关闭文件

在 golang 中重命名之前关闭文件

Go
慕森卡 2021-12-20 15:19:42
当我使用 golang 进行一些文件操作时,我首先打开一个文件并将 close() 添加到 defer 列表中,然后我尝试重命名该文件。如果我手动关闭文件,延迟将再次关闭它。如果我等待延迟关闭它,重命名将导致错误,因为它没有关闭是的。代码如下func main() {    pfile1, _ := os.Open("myfile.log")    defer pfile1.Close() //It will be closed again.    ...    ...    pfile1.Close() //I have to close it before rename it.    os.Rename("myfile.log", "myfile1.log")}我发现了一些丑陋的解决方案,例如创建另一个函数来分隔打开的文件,下面有更好的解决方案吗?func main() {    var pfile1 *os.File    ugly_solution(pfile1)    os.Rename("myfile.log", "myfile1.log")}func ugly_solution(file *os.File) {    file, _ = os.Open("myfile.log")defer file.Close()}
查看完整描述

3 回答

?
陪伴而非守候

TA贡献1757条经验 获得超8个赞

您可以将关闭和重命名文件放在 defer 中:


func main() { 

    pfile1, _ := os.Open("myfile.log")

    defer func(){

        pfile1.Close()

        os.Rename("myfile.log", "myfile1.log")   

    }() 

    ...

    ...

}


查看完整回答
反对 回复 2021-12-20
?
largeQ

TA贡献2039条经验 获得超7个赞

关于您的代码,我有一些不清楚的地方。


首先,为什么要在重命名文件之前打开文件?这不是os.Rename函数所要求的。该函数采用两个表示新旧文件名的字符串,不需要传递文件指针。


func main() {

    ...

    ...

    os.Rename("myfile.log", "myfile1.log")

}

假设您需要更改文件内容(鉴于该ugly_solution方法似乎并非如此)并且您必须打开文件,那么为什么要推迟file.Close()?如果需要在同一方法中的某处显式调用该方法,则不必推迟该方法。简单地调用它。


func main() {

    pfile1, _ := os.Open("myfile.log")

    ...

    ...

    pfile1.Close()

    os.Rename("myfile.log", "myfile1.log")

}


查看完整回答
反对 回复 2021-12-20
?
慕哥6287543

TA贡献1831条经验 获得超10个赞

在您的示例中的情况

也许你想遵循这个场景:

  • 轻松创建可识别的临时文件。

  • 写入数据。

  • 关闭文件。

  • 如果成功重命名文件。

在这种情况下,您想遵循底层文件的操作系统系统操作,也许您只想不推迟关闭 IO.file ,因为您希望得到关闭函数本身返回的错误。

此外,在这种情况下,您可能也想操作 file.sync()。

https://www.joeshaw.org/dont-defer-close-on-writable-files/


查看完整回答
反对 回复 2021-12-20
  • 3 回答
  • 0 关注
  • 125 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信