如何在go中获取文件的独占锁定

问题描述 投票:5回答:1

如何在go中获得对文件的独占读取权限?我已经尝试过文档中的文档,但我仍然可以在记事本中打开文件并进行编辑。我想拒绝任何其他进程有权访问读写,而第一个进程没有显式关闭它。在.NET中我可以做一些事情:

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

我该怎么做?

go
1个回答
1
投票

我终于找到了一个可以锁定文件的go包。

这是回购:https://github.com/juju/fslock

go get -u github.com/juju/fslock

这个包完全符合它的说法

fslock提供了一个基于文件锁的跨进程互斥锁,可以在windows和* nix平台上运行。 fslock依赖Windows上的LockFileEx并在* nix系统上进行群集。超时功能在Windows上使用重叠IO,但在* nix平台上,超时需要使用goroutine,该goroutine将在获取锁定之前运行,无论超时如何。如果您需要避免使用goroutine,请在循环中轮询TryLock。

要使用此包,首先要为lockfile创建一个新锁

func New(filename string) *Lock

如果锁文件已不存在,则此API将创建该文件。

然后我们可以使用lockhandle来锁定(或尝试锁定)文件

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()
}
© www.soinside.com 2019 - 2024. All rights reserved.