Heim > Backend-Entwicklung > Golang > Fehler „Ungültiges Handle' beim Aufruf von GetFileInformationByHandle mit einem Handle, das mit GetFileVersionInfoSize initialisiert wurde

Fehler „Ungültiges Handle' beim Aufruf von GetFileInformationByHandle mit einem Handle, das mit GetFileVersionInfoSize initialisiert wurde

WBOY
Freigeben: 2024-02-09 10:24:20
nach vorne
1118 Leute haben es durchsucht

使用使用 GetFileVersionInfoSize 初始化的句柄调用 GetFileInformationByHandle 时出现“句柄无效”错误

Der PHP-Editor Yuzai hat beim Aufruf von GetFileInformationByHandle mit dem von GetFileVersionInfoSize initialisierten Handle einen Fehler „Ungültiges Handle“ festgestellt. Dieser Fehler wird normalerweise dadurch verursacht, dass das Handle die Dateiinformationen nicht korrekt identifiziert. Es gibt mehrere Möglichkeiten, dieses Problem zu lösen, z. B. die Überprüfung, ob das Handle korrekt initialisiert ist, die Bestätigung, dass der Dateipfad korrekt ist, und die Überprüfung, ob die Datei bereits von einem anderen Prozess belegt ist. Durch sorgfältige Untersuchung und Verarbeitung kann dieses Problem gelöst und die Dateiinformationen reibungslos abgerufen werden.

Frageninhalt

Ich versuche, Dateiinformationen, einschließlich der Erstellungszeit der Datei, programmgesteuert mithilfe von Go unter Windows abzurufen.

Ich habe golang.org/x/sys/windows 中发现一个函数,它返回有关何时创建文件的信息,该函数是 getfileinformationbyhandle (go 文档、windows api 文档)。但是,我使用此函数编写的代码给了我一个 the handle is invalid falsch gelegen.

Das ist mein Code:

package main

import (
    "log"
    "os"

    "golang.org/x/sys/windows"
)

func main() {
    name := `c:\windows\system32\cmd.exe`

    fileinfo, err := os.stat(name)
    if err != nil {
        log.fatalf("unable to stat %s: %s", name, err.error())
    }

    log.printf("%s has base name %s.\n", name, fileinfo.name())

    var handle windows.handle
    _, err = windows.getfileversioninfosize(name, &handle)
    if err != nil && err != windows.error_file_not_found && err != windows.error_resource_type_not_found {
        log.fatalf("getfileversioninfosize error: path: %s %s", name, err.error())
    }

    var hndlfileinfo windows.byhandlefileinformation
    err = windows.getfileinformationbyhandle(handle, &hndlfileinfo)
    if err != nil {
        if err == windows.error_invalid_handle { // https://learn.microsoft.com/en-us/windows/win32/debug/system-error-codes--0-499-
            log.println("error is invalid handle error.")
        }
        log.fatalf("getfileinformationbyhandle error: path: %s %s", name, err.error())
    }

    log.println("success!")
}
Nach dem Login kopieren

Wenn ich es ausführe, erhalte ich die folgende Ausgabe:

2023/01/11 14:43:19 c:\windows\system32\cmd.exe has base name cmd.exe.
2023/01/11 14:43:19 error is invalid handle error.
2023/01/11 14:43:19 getfileinformationbyhandle error: path: c:\windows\system32\cmd.exe the handle is invalid.
Nach dem Login kopieren

Ich habe bestätigt, dass der Dateipfad gültig ist (außerdem gibt der os.stat-Aufruf keinen Fehler zurück):

Ich weiß, dass das System32-Verzeichnis für 32-Bit-Windows-Programme nicht sichtbar ist, aber ich habe mit dem file-Tool auf Git-Bash überprüft, dass meine ausführbare Datei ein 64-Bit-Programm ist:

$ file win_handle_test.exe
win_handle_test.exe: PE32+ executable (console) x86-64 (stripped to external PDB), for MS Windows
Nach dem Login kopieren

Da der Pfad gültig sein sollte, mache ich möglicherweise etwas falsch, das dazu führt, dass ich ein ungültiges Handle erhalte?

Workaround

Basierend auf dieser Antwort habe ich einen anderen Weg gefunden, die Erstellungszeit zu ermitteln:

package main

import (
    "log"
    "os"
    "time"
    "syscall"
)

func main() {
    name := `c:\windows\system32\cmd.exe`

    fileinfo, err := os.stat(name)
    if err != nil {
        log.fatalf("unable to stat %s: %s", name, err.error())
    }

    log.printf("%s has base name %s.\n", name, fileinfo.name())

    data := fileinfo.sys().(*syscall.win32fileattributedata)
    ctime := time.unix(0, data.creationtime.nanoseconds())

    log.printf("ctime in utc           : %v\n", ctime.utc())
    log.printf("ctime in local timezone: %v\n", ctime)
}
Nach dem Login kopieren

Ausgabe:

2023/01/11 15:03:58 C:\Windows\System32\cmd.exe has base name cmd.exe.
2023/01/11 15:03:58 cTime in UTC           : 2022-05-10 17:34:57.9429156 +0000 UTC
2023/01/11 15:03:58 cTime in local timezone: 2022-05-10 13:34:57.9429156 -0400 EDT
Nach dem Login kopieren

Diese Ausgabe entspricht der Erstellungszeit in der Dateieigenschaftenansicht.

Obwohl filetimefiletime本身的时间自 1601 年 1 月 1 日 utc 起,time.unixnanoseconds selbst am 1. Januar 1601 UTC beginnt, time.unix und Nanosekunden Funktion

basiert auf der Zeit seit dem 1. Januar 1970 UTC. 🎜

Das obige ist der detaillierte Inhalt vonFehler „Ungültiges Handle' beim Aufruf von GetFileInformationByHandle mit einem Handle, das mit GetFileVersionInfoSize initialisiert wurde. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage