C++實現軟體版本號管理類
阿新 • • 發佈:2019-02-18
最近做了個更新程式,更新下配置檔案後通過對比版本號大小來確定是否有更新。原來僅僅只是簡單的比較字串的大小,用_tcscmp來做的,但是在形如:2.2.12.6和2.2.9.6對比時,明顯會不對。於是就用C++寫了一二個簡單的版本號轉化、對比的類。
程式碼如下:
版本成員主要包括:主版本號、次版本號、修正版本號、編譯版本號,關於具體的版本命名規則可以檢視前面轉載的文章軟體版本命名規則。#pragma once #include <string> using std::wstring; class CVersion { public: CVersion() :m_nMajorNumber(0) ,m_nMinorNumber(0) ,m_nRevisionNumber(0) ,m_nBuildNumber(0) { } CVersion(const wstring& strVersion) :m_nMajorNumber(0) ,m_nMinorNumber(0) ,m_nRevisionNumber(0) ,m_nBuildNumber(0) { GetVersion(strVersion); } virtual ~CVersion() { } bool IsDigitString(const wstring& strValue) { if ( strValue.empty() ) return false; for ( size_t i=0; i<strValue.size(); ++i ) { if ( !iswdigit(strValue[i]) ) return false; } return true; } bool GetVersion(const wstring& strVersion) { int nBegin=0, nPos = 0; vector<wstring> numList; wstring strSub; while( (nPos = strVersion.find(L".", nBegin)) != wstring::npos ) { strSub = strVersion.substr(nBegin, nPos-nBegin); if ( strSub.empty() ) return false; if ( !IsDigitString(strSub) ) return false; numList.push_back(strSub); nBegin = nPos+1; } if ( nBegin < strVersion.size() ) { strSub = strVersion.substr(nBegin, strVersion.size()-nBegin); if ( IsDigitString(strSub) ) numList.push_back(strSub); } if ( numList.size()<2 ) return false; m_nMajorNumber = _wtoi(numList[0].c_str()); m_nMinorNumber = _wtoi(numList[1].c_str()); if ( numList.size()>2 ) m_nRevisionNumber = _wtoi(numList[2].c_str()); if ( numList.size()>3 ) m_nBuildNumber = _wtoi(numList[3].c_str()); return true; } int Compare(const CVersion& ver) { if ( m_nMajorNumber > ver.m_nMajorNumber ) return 1; if ( m_nMajorNumber < ver.m_nMajorNumber ) return -1; if ( m_nMinorNumber > ver.m_nMinorNumber ) return 1; if ( m_nMinorNumber < ver.m_nMinorNumber ) return -1; if ( m_nRevisionNumber > ver.m_nRevisionNumber ) return 1; if ( m_nRevisionNumber < ver.m_nRevisionNumber ) return -1; if ( m_nBuildNumber > ver.m_nBuildNumber ) return 1; if ( m_nBuildNumber < ver.m_nBuildNumber ) return -1; return 0; } bool operator ==(const CVersion& ver) { return Compare(ver) == 0; } bool operator !=(const CVersion& ver) { return Compare(ver) != 0; } bool operator <(const CVersion& ver) { return Compare(ver) < 0; } bool operator >(const CVersion& ver) { return Compare(ver) > 0; } private: int m_nMajorNumber; int m_nMinorNumber; int m_nRevisionNumber; int m_nBuildNumber; };
如何使用這個類的話,也不用細說了吧,可以直接構造時傳入版本字串,也可以呼叫GetVersion函式來初始化版本號資訊。