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

当我使用 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()

}


慕森卡
浏览 126回答 3
3回答

陪伴而非守候

您可以将关闭和重命名文件放在 defer 中:func main() {     pfile1, _ := os.Open("myfile.log")    defer func(){        pfile1.Close()        os.Rename("myfile.log", "myfile1.log")       }()     ...    ...}

largeQ

关于您的代码,我有一些不清楚的地方。首先,为什么要在重命名文件之前打开文件?这不是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")}

慕哥6287543

在您的示例中的情况也许你想遵循这个场景:轻松创建可识别的临时文件。写入数据。关闭文件。如果成功重命名文件。在这种情况下,您想遵循底层文件的操作系统系统操作,也许您只想不推迟关闭 IO.file ,因为您希望得到关闭函数本身返回的错误。此外,在这种情况下,您可能也想操作 file.sync()。见https://www.joeshaw.org/dont-defer-close-on-writable-files/
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go