Search code examples
go

golang os.Close() function works, but os.Remove() function does not


I am trying to create a file, open it, do some processing on it & close it. Finally, I want to delete the file. All these operations are executed successfully, except the deletion.

My code is:

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")
}

The output is:

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.

I am clueless about this


Solution

  • The problem is related to the first opened file.

    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")
    }
    

    As you can see, i've used the var tmpFile in order to close the first file that you have opened. The result is following one:

    Hello
    Success