gpt4 book ai didi

Windows OpenFile 标志

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

我正在尝试编写一个程序来读取文件,同时允许其他应用程序访问它。我了解到,在 Windows 中,您需要传递 syscall.FILESHARE_READ/WRITE 标志以防止文件锁定。但是,引入这些标志首先限制了我读取文件,并出现错误 — read ‘file’: Access is denied。这是我的代码:

os.OpenFile(path, syscall.O_RDONLY | syscall.FILE_SHARE_WRITE | syscall.FILE_SHARE_READ, 0444)

我使用的标志是否正确? Windows 是否允许此功能?

这是一个示例 Go 程序使用此命令构建 - GOOS=windows GOARCH=amd64 go build -v -o testRead.exe

package main

import (
"fmt"
"os"
"time"
"bufio"
"syscall"
)

func main() {

if len(os.Args) != 2 {
fmt.Println("Specify file!")
return
}

path := os.Args[1]
f, err := os.OpenFile(path, syscall.O_RDONLY|syscall.FILE_SHARE_WRITE | syscall.FILE_SHARE_READ, 0444)
//f, err := os.Open(path)
if err != nil {
fmt.Println("Can't open file")
fmt.Println(err)
return
}
defer f.Close()

reader := bufio.NewReader(f)
line, _, err := reader.ReadLine()
if (err != nil) {
fmt.Println(err)
}
fmt.Println(line)


// Keeps the program alive
t1 := time.Now().Local().Add(time.Second * time.Duration(3))
for {
if time.Now().After(t1) {
fmt.Println("Still Alive!")
t1 = time.Now().Local().Add(time.Second * time.Duration(3))
}
}
}

我观察到使用 os.Open 和 os.OpenFile(path, syscall.O_RDONLY, 0444) 读取效果很好。

最佳答案

XY 问题是询问您尝试的解决方案而不是您的实际问题:The XY Problem .


如果我们用

打开文件
f, err := os.OpenFile(path, syscall.O_RDONLY, 0444)

您的程序运行没有错误。

在 Windows 上,程序使用 CreateFile

DesiredAccess = GENERIC_READ
ShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE

由于某些未知原因,您在 Windows 上使用了任意 os.OpenFile flag bit smashing。

f, err := os.OpenFile(path, syscall.O_RDONLY|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_READ, 0444)

在哪里

const (
O_RDONLY = 0x00000
O_WRONLY = 0x00001
O_RDWR = 0x00002

FILE_SHARE_READ = 0x00000001
FILE_SHARE_WRITE = 0x00000002
)

用不相关的文件共享位粉碎 os.OpenFile flag 模式位,你有

flag = syscall.O_RDONLY|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_READ

flag = O_RDONLY|O_WRONLY|O_RDWR

结果未定义。

在 Windows 上,报错:read test.file: Access is denied.

在 Linux 上,检测到错误:read test.file: bad file descriptor

关于Windows OpenFile 标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53110943/

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