golang os.Функция Close () работает, но функция os.Remove() не работает

#go

#Вперед

Вопрос:

Я пытаюсь создать файл, открыть его, выполнить некоторую обработку над ним и закрыть его. Наконец, я хочу удалить файл. Все эти операции выполнены успешно, за исключением удаления.

Мой код:

 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.
  

Я ничего не знаю об этом

Комментарии:

1. Просто чтобы быть уверенным: у вас нет этого файла, открытого в каком-либо другом редакторе или около того?

2. Нет, файл не был открыт ни в одном редакторе. К моему удивлению, при запуске того же кода в Ubuntu проблем не возникает

Ответ №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
  

Комментарии:

1. Спасибо, это работает! К моему удивлению, проблема была только в Windows; более ранний код абсолютно нормально работал в Ubuntu, я не знаю почему?

2. Это потому, что в Unix и Windows есть разные способы управления открытыми файлами.