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.
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?
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 filetime
time.unix
和 nanoseconds
itu sendiri bermula dari 1 Januari 1601 UTC, time.unix dan nanosaat Fungsi
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!