Maison >développement back-end >Golang >Erreur « handle non valide » lors de l'appel de GetFileInformationByHandle avec un handle initialisé avec GetFileVersionInfoSize
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.
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 ?
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 filetime
filetime
本身的时间自 1601 年 1 月 1 日 utc 起,time.unix
和 nanoseconds
lui-même commence le 1er janvier 1601 UTC, time.unix
et nanosecondes La fonction
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!