gpt4 book ai didi

go - 如何在go中获得文件的独占锁

转载 作者:IT王子 更新时间:2023-10-29 01:28:09 28 4
gpt4 key购买 nike

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

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

我该怎么做?

最佳答案

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

这是 repo 协议(protocol):<强> https://github.com/juju/fslock

go get -u github.com/juju/fslock

这个包完全按照它说的做

fslock provides a cross-process mutex based on file locks that works on windows and *nix platforms. fslock relies on LockFileEx on Windows and flock on *nix systems. The timeout feature uses overlapped IO on Windows, but on *nix platforms, timing out requires the use of a goroutine that will run until the lock is acquired, regardless of timeout. If you need to avoid this use of goroutines, poll TryLock in a loop.

要使用这个包,首先,为锁文件创建一个新锁

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()
}

关于go - 如何在go中获得文件的独占锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52986413/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com