Флаги Windows OpenFile - PullRequest
       1

Флаги Windows OpenFile

0 голосов
/ 02 ноября 2018

Я пытаюсь написать программу, которая читает файл, позволяя другим приложениям получать к нему доступ. Я узнал, что в Windows вам нужно передать флаги syscall.FILESHARE_READ / WRITE, чтобы предотвратить блокировку файлов. Однако введение этих флагов ограничивает меня от чтения файла в первую очередь, с ошибкой - прочитайте «файл»: доступ запрещен. Это мой код:

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).

1 Ответ

0 голосов
/ 04 ноября 2018

Проблема XY спрашивает о вашей попытке решения, а не о реальной проблеме: Проблема XY .


Если мы откроем файл с

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

ваша программа работает без ошибок.

В Windows программа использует CreateFile с

DesiredAccess = GENERIC_READ
ShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE

По какой-то неизвестной причине вы используете произвольный os.OpenFile flag битовый разбой в Windows.

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...