Как получить эксклюзивную блокировку файла в го - PullRequest
0 голосов
/ 25 октября 2018

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

File.Open("a.txt", FileMode.Open, FileAccess.ReadWrite, FileShare.None);

Как мне это сделать на ходу?

1 Ответ

0 голосов
/ 26 октября 2018

Я наконец нашел пакет go, который может заблокировать файл.

Вот репозиторий: https://github.com/juju/fslock

go get -u github.com/juju/fslock

этот пакет делает именно то, что говорит

fslock предоставляет межпроцессный мьютекс, основанный на блокировках файлов, который работает на платформах Windows и * nix.fslock использует LockFileEx в Windows и работает в системах * nix.Функция тайм-аута использует перекрывающийся ввод-вывод в Windows, но на платформах * nix для тайм-аута требуется использование программы, которая будет работать до тех пор, пока не будет получена блокировка, независимо от времени ожидания.Если вам необходимо избежать такого использования подпрограмм, опросите TryLock в цикле.

Чтобы использовать этот пакет, сначала создайте новую блокировку для файла блокировки

func New(filename string) *Lock

Этот APIсоздаст файл блокировки, если он уже не существует.

Затем мы можем использовать ручку блокировки, чтобы заблокировать (или попробовать заблокировать) файл

func (l *Lock) Lock() error

Существует также версия тайм-аутаВышеупомянутая функция, которая будет пытаться получить блокировку файла до истечения времени ожидания

func (l *Lock) LockWithTimeout(timeout time.Duration) error

Наконец, если вы закончили, снимите полученную блокировку с помощью

func (l *Lock) Unlock() error

Очень базовая реализация

package main

import (
    "time"
    "fmt"
    "github.com/juju/fslock"
)

func main() {
    lock := fslock.New("../lock.txt")
    lockErr := lock.TryLock()
    if lockErr != nil {
        fmt.Println("falied to acquire lock > " + lockErr.Error())
        return
    }

    fmt.Println("got the lock")
    time.Sleep(1 * time.Minute)

    // release the lock
    lock.Unlock()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...