This is a simple console problem to display all file version and time for current folder. The full code as follow:
// PrintF.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <stdio.h> #include <afx.h> #include <shlwapi.h> enum PrintParam { Print_Version = 1, Print_Time = 2, }; WORD GetFileVersion(VS_FIXEDFILEINFO FileInfo, int nIndex); void EmitErrorMsg (HRESULT hr); void GetFileTimeString(char *fname, CString &outStr); void GetFileVersionString(char *fname, CString &outStr); HRESULT GetFileVersion (char *filename, VS_FIXEDFILEINFO *vsf); HRESULT GetFileDate (char *filename, FILETIME *pft); HRESULT LastError(); BOOL StartPrint(PrintParam nPrintType = Print_Version); int main(int argc, char* argv[]) { // // v Print file version // t Print file create time // null print file version as default. // if (argc != 2) { StartPrint(Print_Version); } else { char chAction = argv[1][0]; switch(chAction) { case 'v': case 'V': StartPrint(Print_Version); break; case 't': case 'T': StartPrint(Print_Time); break; default: break; } } return 0; } void GetFileTimeString(char *fname, CString &outStr) { FILETIME t; GetFileDate(fname, &t); FILETIME lft; FILETIME *ft = &lft; FileTimeToLocalFileTime(&t,ft); //outStr.Format("%08x %08x",ft->dwHighDateTime,ft->dwLowDateTime); { SYSTEMTIME stCreate; BOOL bret = FileTimeToSystemTime(ft,&stCreate); outStr.Format("%02d/%02d/%d %02d:%02d:%02d", stCreate.wMonth, stCreate.wDay, stCreate.wYear, stCreate.wHour, stCreate.wMinute, stCreate.wSecond); } } void GetFileVersionString(char *fname, CString &outStr) { VS_FIXEDFILEINFO FileInfo; if (SUCCEEDED(GetFileVersion(fname, &FileInfo))) { outStr.Format("%d.%d.%d.%d", GetFileVersion(FileInfo, 3), GetFileVersion(FileInfo, 2), GetFileVersion(FileInfo, 1), GetFileVersion(FileInfo, 0)); } else outStr = "No info"; } WORD GetFileVersion(VS_FIXEDFILEINFO FileInfo, int nIndex) { if (nIndex == 0) return (WORD)(FileInfo.dwFileVersionLS & 0x0000FFFF); else if (nIndex == 1) return (WORD)((FileInfo.dwFileVersionLS & 0xFFFF0000) >> 16); else if (nIndex == 2) return (WORD)(FileInfo.dwFileVersionMS & 0x0000FFFF); else if (nIndex == 3) return (WORD)((FileInfo.dwFileVersionMS & 0xFFFF0000) >> 16); else return 0; } HRESULT GetFileDate (char *filename, FILETIME *pft) { // we are interested only in the create time // this is the equiv of "modified time" in the // Windows Explorer properties dialog FILETIME ct,lat; HANDLE hFile = CreateFile(filename,GENERIC_READ,FILE_SHARE_READ | FILE_SHARE_WRITE,0,OPEN_EXISTING,0,0); if (hFile == INVALID_HANDLE_VALUE) return E_FAIL;//LastError(); BOOL bret = GetFileTime(hFile,&ct,&lat,pft); if (bret == 0) return E_FAIL;//LastError(); return S_OK; } // This function gets the file version info structure HRESULT GetFileVersion (char *filename, VS_FIXEDFILEINFO *pvsf) { DWORD dwHandle; DWORD cchver = GetFileVersionInfoSize(filename,&dwHandle); if (cchver == 0) return E_FAIL;//LastError(); char* pver = new char[cchver]; BOOL bret = GetFileVersionInfo(filename,dwHandle,cchver,pver); if (!bret) return E_FAIL;//LastError(); UINT uLen; void *pbuf; bret = VerQueryValue(pver,"\\",&pbuf,&uLen); if (!bret) return E_FAIL;//LastError(); memcpy(pvsf,pbuf,sizeof(VS_FIXEDFILEINFO)); delete[] pver; return S_OK; } HRESULT LastError () { HRESULT hr = HRESULT_FROM_WIN32(GetLastError()); if (SUCCEEDED(hr)) return E_FAIL; return hr; } // This little function emits an error message based on WIN32 error messages void EmitErrorMsg (HRESULT hr) { char szMsg[1024]; FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM, NULL, hr, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), szMsg, 1024, NULL ); printf("%s\n",szMsg); } BOOL StartPrint(PrintParam nPrintType) { char szIniPATH[1024]; GetModuleFileName(NULL, szIniPATH, 1024); PathRemoveFileSpec(szIniPATH); PathAddBackslash(szIniPATH); CFileFind finder; CString folder = szIniPATH; folder += "*.*"; BOOL bWorking = finder.FindFile(folder); if (!bWorking) //Folder not found... { return FALSE; } BOOL bBuildFound = FALSE; while (bWorking) { bWorking = finder.FindNextFile(); if (finder.IsDots()) continue; if (!finder.IsDirectory()) { CString strFileVersion; CString filePath = finder.GetFilePath(); CString filename = finder.GetFileName(); if (nPrintType == Print_Version) GetFileVersionString(filePath.GetBuffer(), strFileVersion); else if (nPrintType == Print_Time) GetFileTimeString(filePath.GetBuffer(), strFileVersion); printf("%s, %s\n", filename, strFileVersion); } } return TRUE; }