Константа os.O_EXCL
Константа os.O_EXCL используется при открытии файла
вместе с флагом os.O_CREATE. Она гарантирует,
что файл будет создан только в том случае, если он не существует.
Если файл с указанным именем уже присутствует в системе,
вызов вернет ошибку. Это особенно полезно для предотвращения
случайной перезаписи существующих файлов, когда требуется
создать новый уникальный файл.
Синтаксис
os.OpenFile(name, os.O_CREATE|os.O_EXCL|os.O_WRONLY, perm)
Пример
Попробуем создать новый файл, которого еще не существует:
package main
import (
"fmt"
"os"
)
func main() {
file, err := os.OpenFile("newfile.txt", os.O_CREATE|os.O_EXCL|os.O_WRONLY, 0644)
if err != nil {
fmt.Println("Error:", err)
return
}
defer file.Close()
file.WriteString("Hello, World!")
fmt.Println("File created successfully")
}
Результат выполнения кода:
"File created successfully"
Пример
Попробуем создать файл, который уже существует. В этом случае мы получим ошибку:
package main
import (
"fmt"
"os"
)
func main() {
// Сначала создадим файл
file1, err := os.Create("existing.txt")
if err != nil {
fmt.Println("Error creating file:", err)
return
}
file1.Close()
// Теперь попытаемся создать его снова с флагом O_EXCL
file2, err := os.OpenFile("existing.txt", os.O_CREATE|os.O_EXCL|os.O_WRONLY, 0644)
if err != nil {
fmt.Println("Error:", err)
return
}
defer file2.Close()
fmt.Println("File created successfully")
}
Результат выполнения кода:
"Error: open existing.txt: file exists"
Пример
Используем os.O_EXCL для атомарного создания файла
при записи данных. Если файл уже существует, мы не перезаписываем
его и выводим соответствующее сообщение:
package main
import (
"fmt"
"os"
)
func main() {
filename := "data.txt"
file, err := os.OpenFile(filename, os.O_CREATE|os.O_EXCL|os.O_WRONLY, 0644)
if err != nil {
if os.IsExist(err) {
fmt.Println("File already exists, skipping creation")
} else {
fmt.Println("Error:", err)
}
return
}
defer file.Close()
file.WriteString("Important data")
fmt.Println("File created and data written")
}
Результат выполнения кода (при наличии файла):
"File already exists, skipping creation"
Смотрите также
-
константу
os.O_CREATE,
которая указывает на необходимость создания файла -
константу
os.O_TRUNC,
которая очищает содержимое файла при открытии -
константу
os.O_APPEND,
которая добавляет данные в конец файла -
функцию
os.OpenFile,
которая открывает файл с указанными флагами и правами доступа