我有全名&可执行文件的路径,例如C:\IW4\BIN\iw32.exe
,并希望提取该可执行文件的编译日期和时间。
我该怎么做?我找不到合适的解决方案。
我的C ++程序必须使用Borland C ++ Builder在Windows下编译,如果该信息有任何价值。
编辑: 我发现了一些示例代码并且它有效,感谢您的所有指示和提示!
守则是:
#include <stdio.h>
#include <windows.h>
int main (int argc, char** argv)
{
WIN32_FILE_ATTRIBUTE_DATA attr;
SYSTEMTIME creation;
if (argc < 2)
return 1;
GetFileAttributesEx(argv[1], GetFileExInfoStandard, &attr);
FileTimeToSystemTime(&attr.ftLastWriteTime, &creation);
printf("Created: %04d-%02d-%02d %02d:%02d:%02d\n"
"Size: %d bytes\n",
creation.wYear, creation.wMonth, creation.wDay,
creation.wHour, creation.wMinute, creation.wSecond,
attr.nFileSizeLow);
return 0;
}
提供以下输出:
Created: 2013-06-20 12:37:14
Size: 15098368
答案 0 :(得分:2)
您要查找的信息可在可执行映像的IMAGE_FILE_HEADER中找到。您可以通过将字段指向图像中的偏移(艰难的方式)来检索此信息。另一种选择是使用Image Help Library
答案 1 :(得分:1)
您可以使用MapAndLoad和可执行文件名的完整路径来执行此操作,或使用GetModuleFileName为当前进程检索它。它将初始化LOADED_IMAGE结构。
在此结构中,您必须查找FileHeader成员,它是IMAGE_NT_HEADERS结构。从这一个,你必须寻找FileHeader,这是一个IMAGE_FILE_HEADER结构。在这一个中,您可以阅读TimeDateStamp。
IMAGE_FILE_HEADER中的TimeDateStamp表示链接器创建映像时的时间戳。它表示自1970年1月1日UTC时间00:00:00以来的秒数。从这里开始,您可以简单地将其转换为time_t,然后调用localtime来获取包含所需信息的struct tm。
参考
MapAndLoad https://msdn.microsoft.com/en-us/library/windows/desktop/ms680353(v=vs.85).aspx
MapAndUnload https://msdn.microsoft.com/en-us/library/windows/desktop/ms680353(v=vs.85).aspx
GetModuleFileName https://msdn.microsoft.com/en-us/library/windows/desktop/ms683197(v=vs.85).aspx
LOADED_IMAGE https://msdn.microsoft.com/en-us/library/windows/desktop/ms680349(v=vs.85).aspx
IMAGE_NT_HEADERS https://msdn.microsoft.com/en-us/library/windows/desktop/ms680336(v=vs.85).aspx
IMAGE_FILE_HEADER https://msdn.microsoft.com/en-us/library/windows/desktop/ms680313(v=vs.85).aspx
答案 2 :(得分:0)
您可以依赖操作系统的“创建日期”文件元数据(右键单击可执行文件并选择Properties
),但如果文件是以不同方式创建的,则无法使用(例如,复制)。
您可以尝试的另一件事:C ++预处理器有一些您可以使用的宏:__DATE__
和__TIME__
。作为警告,这只会在预处理器运行时显示,而不是在可执行文件完全编译时显示。您可以将这些保存到程序中,然后在运行可执行文件时显示它们。
实际上,最简单的解决方案可能是在构建完成时将当前日期/时间保存在单独的文件中。
答案 3 :(得分:0)
如果您只想要一个日期或时间。(简单代码)
const char *buildDateString = "" __DATE__ "";//for date purpose
const char *buildTimeString ="" __TIME__ "";//for Time purpose