« links for 2008-03-05 | 回到主頁面 | links for 2008-03-06 »

March 06, 2008

Simple console tool to show all file version of current folder 顯示檔案版本的測試程式


將此網頁加入【百度收藏】... 加入此網頁到【del.icio.us 書籤】 technorati

properties.gif

result.JPG

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


VC6相關問題

由 Evan 發表於 March 06, 2008 將此網頁加入【百度收藏】... 加入此網頁到【del.icio.us 書籤】 technorati
引用
迴響
發表迴響









記住我的資訊?




(請輸入以下的驗證碼)