登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-03-09 08:16:59 103浏览 收藏

Golang不知道大家是否熟悉?今天我将给大家介绍《如何在go中获得文件的独占锁》,这篇文章主要会讲到等等知识点,如果你在看完本篇文章后,有更好的建议或者发现哪里有问题,希望大家都能积极评论指出,谢谢!希望我们能一起加油进步!

问题内容

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

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

如何在 go 中做到这一点?


解决方案


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

这是存储库: https://github.com/juju/fslock

go get -u github.com/juju/fslock

这个包的作用正如它所说的

fslock 提供了一个基于文件锁的跨进程互斥锁,可以工作 在 windows 和 *nix 平台上。 fslock 在 windows 上依赖 lockfileex 并涌向 *nix 系统。超时功能使用重叠io windows,但在 *nix 平台上,超时需要使用 goroutine 将运行直到获取锁,无论 暂停。如果您需要避免这种 go​​routine 的使用,请轮询 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()
}

到这里,我们也就讲完了《如何在go中获得文件的独占锁》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>