2016-03-06 66 views
0

當我使用golang進行一些文件操作時,首先打開一個文件並將close()添加到defer列表中,然後嘗試重命名該文件。如果我手動關閉文件,則延遲將再次關閉。如果我等待延遲關閉它,重命名將會導致錯誤,因爲它沒有關閉。代碼如下在golang中重命名文件之前關閉文件

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() 
} 
+1

你爲什麼推遲調用'關閉()'呢?如果你必須打電話給你,你可以讓推遲出去? – nemo

回答

1

有幾件事對我來說並不清楚你的代碼。

首先,爲什麼在重命名之前打開文件?這不是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") 
} 
+0

是的,我想對文件進行更改,然後重命名它。 作爲建議,它不會添加Close()來推遲。 但是如果這樣,Open()和Close()之間的東西恐慌,Close()將不會被延遲調用。 –

+1

然後將執行分爲兩部分。執行文件修改的部分,您打開/編輯/關閉的部分以及重命名的部分。不要混合所有的意圖在一個單一的方法, –

+0

感謝您的建議。拆分和不混合的意圖是一個好方法。 –

1

你可以把在延遲都關閉和重命名文件:

func main() { 
    pfile1, _ := os.Open("myfile.log") 
    defer func(){ 
     pfile1.Close() 
     os.Rename("myfile.log", "myfile1.log") 
    }() 
    ... 
    ... 
} 
+0

但重命名將在函數退出時調用,也許我想在重命名後添加更多代碼。它不會靈活。 –