2009年12月18日 星期五

CuEnvironmentString - Changing Environment Variables

// Changing Environment Variables

CuEnvironmentString envString( szPath );
string strPath(envString);

// CuEnvironmentString.h

class CuEnvironmentString
{
    string m_strString;
public:
    CuEnvironmentString(void);
    CuEnvironmentString(string str);
    ~CuEnvironmentString(void);

public:
    void OnDo( string &str );
    operator string() const;

private:
    BOOL HaveEnvironmentVariable( string &str );
    string GetEnvironmentVariable( string &str );
    string ExplodeEnironmentVariable( string &str, size_t ops = 0 );
    string SubStrToIndexChar( string &str, char ch, size_t pos = 0 );
};


// CuEnvironmentString.cpp

CuEnvironmentString::CuEnvironmentString(void)
{
}

CuEnvironmentString::~CuEnvironmentString(void)
{
}

CuEnvironmentString::CuEnvironmentString(string str)
{
    OnDo(str);
}

void CuEnvironmentString::OnDo( string &str )
{

    m_strString.clear();
    if( !HaveEnvironmentVariable(str) )
    {
        m_strString = str;
        return;
    }

    size_t pos = 0;
    string strNotEnv;
    string strEnv;
    do 
    {
        strNotEnv = SubStrToIndexChar( str, '%', pos);
        m_strString += strNotEnv;
        pos += strNotEnv.size() + 1;

        strEnv = SubStrToIndexChar( str, '%', pos);
        m_strString += this->GetEnvironmentVariable(strEnv);
        pos += strEnv.size() + 1;

    } while ( pos < str.size() );

}

string CuEnvironmentString::SubStrToIndexChar( string &str, char ch, size_t pos/* = 0 */)
{
    string strResult;       
    if( pos > str.size() )
        return strResult;

    size_t found = str.find( '%' , pos);
    strResult = str.substr( pos, found - pos );

    return strResult;
}

string CuEnvironmentString::GetEnvironmentVariable( string &str )
{
    TCHAR newEnv[MAX_PATH +1];
    DWORD res = ::GetEnvironmentVariable( str.c_str(), newEnv, MAX_PATH );
    string strResult;
    if( res != 0 )
        strResult = newEnv;
    return strResult;
}

string CuEnvironmentString::ExplodeEnironmentVariable( string &str, size_t ops /* = 0*/ )
{

    size_t found_first = str.find( '%' , ops );
    size_t found_second = str.find( '%' , found_first + 1);

    string strResult;
    if( found_first != string::npos && found_second != string::npos )
        strResult = str.substr (found_first + 1, found_second - 1);

    return strResult;

}

BOOL CuEnvironmentString::HaveEnvironmentVariable( string &str )
{
    string strResult = ExplodeEnironmentVariable(str);
    return (!strResult.empty());
}

CuEnvironmentString::operator string() const
{ return string(m_strString.begin(), m_strString.end()); }

1 則留言:

  1. 為了一個環境變數轉換要搞一個類別, 這個工作合算嗎??

    回覆刪除