使用使用 GetFileVersionInfoSize 初始化的句柄调用 GetFileInformationByHandle 时出现'句柄无效”错误
php小编鱼仔在使用GetFileVersionInfoSize初始化的句柄调用GetFileInformationByHandle时遇到了"句柄无效"错误。这个错误通常是由于句柄无法正确地识别文件信息导致的。解决这个问题的方法有多种,例如检查句柄是否正确初始化,确认文件路径是否正确,以及检查文件是否已被其他进程占用。通过仔细排查和处理,可以解决这个问题并顺利获取文件信息。
问题内容
我正在尝试在 windows 上使用 go 以编程方式获取文件信息,包括文件的创建时间。
我在 golang.org/x/sys/windows
中发现一个函数,它返回有关何时创建文件的信息,该函数是 getfileinformationbyhandle
(go 文档、windows api 文档)。但是,我使用此函数编写的代码给了我一个 the handle is invalid
错误。
这是我的代码:
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!") }
当我运行它时,我得到以下输出:
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.
我已确认文件路径有效(加上 os.stat
调用不会返回错误):
我知道 system32 目录对于 32 位 windows 程序不可见,但我已经使用 git-bash 上的 file
工具验证了我的可执行文件是 64 位程序:
$ file win_handle_test.exe win_handle_test.exe: PE32+ executable (console) x86-64 (stripped to external PDB), for MS Windows
既然路径应该是有效的,我可能做错了什么,导致我得到无效的句柄?
解决方法
根据这个答案,我找到了另一种获取创建时间的方法:
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) }
输出:
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
此输出与文件属性视图中的创建时间匹配。
尽管 filetime
filetime
本身的时间自 1601 年 1 月 1 日 utc 起,time.unix
和 nanoseconds
本身的时间自 1601 年 1 月 1 日 utc 起,time.unix
和 nanoseconds
函数
以上是使用使用 GetFileVersionInfoSize 初始化的句柄调用 GetFileInformationByHandle 时出现'句柄无效”错误的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

自 2009 年问世以来,比特币成为加密货币界的领头羊,其价格经历了巨大的波动。为了提供全面的历史概述,本文汇集了从 2009 年到 2025 年的比特币价格数据,涵盖了重大的市场事件、市场情绪变化和影响价格走势的重要因素。

比特币,作为一种加密货币,自问世以来经历了显着的市场波动。本文将提供比特币自诞生以来的历史价格总览,帮助读者了解其价格趋势和关键时刻。通过分析比特币的历史价格数据,我们可以了解市场对其价值评估、影响其波动的因素,并为未来投资决策提供依据。

比特币自 2009 年创世以来,价格经历多次大幅波动,最高涨至 2021 年 11 月的 69,044.77 美元,最低跌至 2018 年 12 月的 3,191.22 美元。截至 2024 年 12 月,最新价格突破 100,204 美元。

实时比特币美元价格 影响比特币价格的因素 预测比特币未来价格的指标 以下是 2018-2024 年比特币价格的一些关键信息:

比特币历史价格重要节点2009 年1 月 3 日:创世区块生成,第一个比特币产生,价值为 0 美元。10 月 5 日:第一笔比特币交易,一名程序员用 10,000 比特币购买了两个披萨,相当于 0.008 美元。2010 年2 月 9 日:Mt. Gox 交易所上线,成为比特币早期交易的主要平台。5 月 22 日:比特币首次突破 1 美元。7 月 17 日:比特币价格暴跌至 0.008 美元,触及历史低点。2011 年2 月 9 日:比特币价格首次突破 10 美元。4 月 10 日:Mt. Go

ChatGPT时代的技术问答社区:思否(SegmentFault)的应对策略StackOverflow...

如何实现分段器的45度曲线效果?在实现分段器的过程中,如何让点击左侧按钮时右侧边框变成45度曲线,而点�...

虚拟币资金费率是在衍生品交易中对持有仓位的交易者收取的费用。它反映了合约到期时现货市场价格和期货合约价格之间的溢价或贴水。当现货价格高于期货价格时,资金费率为负,这意味着做空头寸的交易者向做多头寸的交易者支付费用。相反,当现货价格低于期货价格时,资金费率为正,这意味着做多头寸的交易者向做空头寸的交易者支付费用。
