关闭文件,然后在golang中将其重命名
当我对golang执行一些文件操作时,我首先打开一个文件并将close()添加到延迟列表中,然后尝试重命名该文件。如果我手动关闭该文件,延迟将再次关闭它。如果我等待延迟关闭它,重命名将导致错误,因为它没有关闭yey。代码如下关闭文件,然后在golang中将其重命名,go,deferred,Go,Deferred,当我对golang执行一些文件操作时,我首先打开一个文件并将close()添加到延迟列表中,然后尝试重命名该文件。如果我手动关闭该文件,延迟将再次关闭它。如果我等待延迟关闭它,重命名将导致错误,因为它没有关闭yey。代码如下 func main() { pfile1, _ := os.Open("myfile.log") defer pfile1.Close() //It will be closed again. ... ... pfile1.Clos
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()
}
关于您的代码,有一些事情我还不清楚 首先,为什么要在重命名文件之前打开它?这不是函数所必需的。该函数接受两个表示新旧文件名的字符串,无需传递文件指针
func main() {
...
...
os.Rename("myfile.log", "myfile1.log")
}
假设您需要更改文件内容(考虑到丑陋的解决方案
方法,情况似乎并非如此),并且必须打开文件,那么为什么要推迟file.Close()
?如果需要在同一方法中的某个地方显式调用该方法,则不必延迟该方法。简单地说
func main() {
pfile1, _ := os.Open("myfile.log")
...
...
pfile1.Close()
os.Rename("myfile.log", "myfile1.log")
}
关于您的代码,有一些事情我还不清楚 首先,为什么要在重命名文件之前打开它?这不是函数所必需的。该函数接受两个表示新旧文件名的字符串,无需传递文件指针
func main() {
...
...
os.Rename("myfile.log", "myfile1.log")
}
假设您需要更改文件内容(考虑到丑陋的解决方案
方法,情况似乎并非如此),并且必须打开文件,那么为什么要推迟file.Close()
?如果需要在同一方法中的某个地方显式调用该方法,则不必延迟该方法。简单地说
func main() {
pfile1, _ := os.Open("myfile.log")
...
...
pfile1.Close()
os.Rename("myfile.log", "myfile1.log")
}
您可以将关闭和重命名文件放在“延迟”中:
func main() {
pfile1, _ := os.Open("myfile.log")
defer func(){
pfile1.Close()
os.Rename("myfile.log", "myfile1.log")
}()
...
...
}
您可以将关闭和重命名文件放在“延迟”中:
func main() {
pfile1, _ := os.Open("myfile.log")
defer func(){
pfile1.Close()
os.Rename("myfile.log", "myfile1.log")
}()
...
...
}
在你的样品中这样的情况下 也许您希望遵循以下场景:
- 轻松创建可识别的临时文件李>
- 写下数据
- 关闭文件李>
- 如果成功,请重命名该文件
请参见示例中的情况 也许您希望遵循以下场景:
- 轻松创建可识别的临时文件李>
- 写下数据
- 关闭文件李>
- 如果成功,请重命名该文件
请参见您为什么要推迟调用
Close()
?如果您必须调用它,您可以不使用defer?为什么您要将调用推迟到Close()
?如果你必须调用它,你可以不使用延迟?是的,我想对文件进行更改,然后重命名它。根据建议,它不会添加Close()来延迟。但是,如果在Open()和Close()之间出现死机,那么delfer将不会调用Close(),然后将执行分为两部分。执行文件修改的零件,可在其中打开/编辑/关闭,以及可在其中重命名的零件。不要把所有的意图混为一谈,谢谢你的建议。拆分和不混合的意图是一个很好的方法。是的,我想对文件进行更改,然后重命名它。根据建议,它不会添加Close()来延迟。但是,如果在Open()和Close()之间出现死机,那么delfer将不会调用Close(),然后将执行分为两部分。执行文件修改的零件,可在其中打开/编辑/关闭,以及可在其中重命名的零件。不要把所有的意图混为一谈,谢谢你的建议。拆分和不混合的意图是一个很好的方法。但是当函数退出时会调用重命名,也许我想在重命名后添加更多的代码。它将不灵活。但重命名将在函数退出时调用,也许我想在重命名后添加更多代码。它不会灵活。