#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 есть разные способы управления открытыми файлами.