Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Ralat "pengendali tidak sah" semasa memanggil GetFileInformationByHandle dengan pemegang yang dimulakan dengan GetFileVersionInfoSize

Ralat "pengendali tidak sah" semasa memanggil GetFileInformationByHandle dengan pemegang yang dimulakan dengan GetFileVersionInfoSize

WBOY
WBOYke hadapan
2024-02-09 10:24:201058semak imbas

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

editor php Yuzai mengalami ralat "pengendali tidak sah" semasa memanggil GetFileInformationByHandle menggunakan pemegang yang dimulakan oleh GetFileVersionInfoSize. Ralat ini biasanya disebabkan oleh pemegang tidak mengenal pasti maklumat fail dengan betul. Terdapat beberapa cara untuk menyelesaikan masalah ini, seperti menyemak sama ada pemegang dimulakan dengan betul, mengesahkan bahawa laluan fail adalah betul dan menyemak sama ada fail telah diduduki oleh proses lain. Melalui penyiasatan dan pemprosesan yang teliti, masalah ini dapat diselesaikan dan maklumat fail dapat diperoleh dengan lancar.

Kandungan soalan

Saya cuba mendapatkan maklumat fail, termasuk masa penciptaan fail, secara pengaturcaraan menggunakan go on windows.

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

Ini kod saya:

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

Apabila saya menjalankannya, saya mendapat output berikut:

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.

Saya telah mengesahkan bahawa laluan fail adalah sah (ditambah dengan panggilan os.stat tidak mengembalikan ralat):

Saya tahu direktori system32 tidak kelihatan kepada program windows 32-bit, tetapi saya telah mengesahkan bahawa boleh laku saya ialah program 64-bit menggunakan alat file pada git-bash:

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

Memandangkan laluan itu sepatutnya sah, bolehkah saya melakukan sesuatu yang salah yang menyebabkan saya mendapat pemegang yang tidak sah?

Penyelesaian

Berdasarkan jawapan ini, saya menemui cara lain untuk mendapatkan masa penciptaan:

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

Keluaran:

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

Output ini sepadan dengan masa penciptaan dalam paparan sifat fail.

Walaupun masa failfiletime本身的时间自 1601 年 1 月 1 日 utc 起,time.unixnanoseconds itu sendiri bermula dari 1 Januari 1601 UTC, time.unix dan nanosaat Fungsi

adalah berdasarkan masa sejak 1 Januari 1970 UTC. 🎜

Atas ialah kandungan terperinci Ralat "pengendali tidak sah" semasa memanggil GetFileInformationByHandle dengan pemegang yang dimulakan dengan GetFileVersionInfoSize. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam