【问题标题】:golang os.Close() function works, but os.Remove() function does notgolang os.Close() 函数有效,但 os.Remove() 函数无效
【发布时间】:2020-08-24 11:02:08
【问题描述】:

我正在尝试创建一个文件,打开它,对其进行一些处理并关闭它。最后,我想删除文件。 所有这些操作都执行成功了,除了删除。

我的代码是:

package main

import (
    "fmt"
    "os"
    "log"
)

func main() {
    fmt.Println("Hello")
    metaFileName := "./metadata.txt"
    _, err2 := os.Create(metaFileName)
    if err2 != nil {
        log.Fatal(err2)
    }
    
    openMetaFile, err := os.Open(metaFileName)
    if err != nil {
        log.Fatal(err)
    }
    
    err = openMetaFile.Close()
    if err != nil {
        log.Fatal(err)
    }
    
    err = os.Remove(metaFileName)
    if err != nil {
        log.Fatal(err)
    }
    
    fmt.Println("Success")
}

输出是:

Hello
2020/08/24 00:00:00 remove ./metadata.txt: The process cannot access the file be
cause it is being used by another process.

我对此一无所知

【问题讨论】:

  • 只是为了确定:您没有在其他编辑器中打开该文件?
  • 否,文件未在任何编辑器中打开。令我惊讶的是,当我在 Ubuntu 上运行相同的代码时没有问题

标签: go


【解决方案1】:

问题与第一个打开的文件有关。

package main

import (
    "fmt"
    "log"
    "os"
)

const metaFileName = "./metadata.txt"

func main() {
    var (
        err                   error
        tmpFile, openMetaFile *os.File
    )

    fmt.Println("Hello")
    if tmpFile, err = os.Create(metaFileName); err != nil {
        log.Fatal(err)
    }

    if err = tmpFile.Close(); err != nil {
        log.Fatal(err)
    }

    if openMetaFile, err = os.Open(metaFileName); err != nil {
        log.Fatal(err)
    }

    if err = openMetaFile.Close(); err != nil {
        log.Fatal(err)
    }

    if err = os.Remove(metaFileName); err != nil {
        log.Fatal(err)
    }

    fmt.Println("Success")
}

如您所见,我使用了 var a 来关闭您打开的第一个文件。结果如下:

Hello
Success

【讨论】:

  • 谢谢,它有效!令我惊讶的是,这个问题只存在于 Windows 中。早期的代码在 Ubuntu 中运行良好,我不知道为什么?
  • 这是因为 Unix 和 Windows 管理打开文件的方式不同。
猜你喜欢
  • 2023-03-16
  • 1970-01-01
  • 2017-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-23
  • 2020-04-14
  • 2015-07-19
相关资源
最近更新 更多