Maison >développement back-end >Golang >Erreur « handle non valide » lors de l'appel de GetFileInformationByHandle avec un handle initialisé avec GetFileVersionInfoSize

Erreur « handle non valide » lors de l'appel de GetFileInformationByHandle avec un handle initialisé avec GetFileVersionInfoSize

WBOY
WBOYavant
2024-02-09 10:24:201143parcourir

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

L'éditeur php Yuzai a rencontré une erreur "handle invalide" lors de l'appel de GetFileInformationByHandle à l'aide du handle initialisé par GetFileVersionInfoSize. Cette erreur est généralement provoquée par le handle qui n’identifie pas correctement les informations du fichier. Il existe plusieurs façons de résoudre ce problème, par exemple vérifier si le handle est correctement initialisé, confirmer que le chemin du fichier est correct et vérifier si le fichier est déjà occupé par un autre processus. Grâce à une enquête et un traitement minutieux, ce problème peut être résolu et les informations sur les fichiers peuvent être obtenues sans problème.

Contenu de la question

J'essaie d'obtenir des informations sur le fichier, y compris l'heure de création du fichier, par programme en utilisant Go sur Windows.

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

Voici mon 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!")
}

Lorsque je l'exécute, j'obtiens le résultat suivant :

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.

J'ai confirmé que le chemin du fichier est valide (de plus, l'appel os.stat ne renvoie pas d'erreur) :

Je sais que le répertoire system32 n'est pas visible par les programmes Windows 32 bits, mais j'ai vérifié que mon exécutable est un programme 64 bits à l'aide de l'outil file sur git-bash :

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

Puisque le chemin doit être valide, pourrais-je faire quelque chose de mal qui m'amène à obtenir un identifiant invalide ?

Solution

Sur la base de cette réponse, j'ai trouvé une autre façon d'obtenir l'heure de création :

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

Sortie :

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

Cette sortie correspond à l'heure de création dans la vue des propriétés du fichier.

Bien que filetimefiletime本身的时间自 1601 年 1 月 1 日 utc 起,time.unixnanoseconds lui-même commence le 1er janvier 1601 UTC, time.unix et nanosecondes La fonction

est basée sur l'heure depuis le 1er janvier 1970 UTC. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer