比特币源码研读(7)-main函数(6)steemCreated with Sketch.

in #btc7 years ago

识别完帮助信息和版本信息以后,下面是对异常时间的处理

try{

//保护代码

}

catch (const std::exception& e) {

PrintExceptionContinue(&e, "AppInit()");

}

catch (...) {

PrintExceptionContinue(nullptr, "AppInit()");

}

即如果try中的代码出现异常,则会被catch捕获。在这里我们先分析try中的“保护代码”
1)判断目录是否正确:如果目录不正确,则弹出对话框,提示数据目录不存在,并退出软件

if(!fs::is_directory(GetDataDir(false)))

{

fprintf(stderr, "Error: Specified data directory "%s"does not exist.\n", gArgs.GetArg("-datadir", "").c_str());

returnfalse;

}
if语句中fs定义是

namespace fs = boost::filesystem;
filesystem库是一种可移植的文件系统操作库,可以跨平台的操作目录、文件等,filesystem库的所有内容定义在boost名字空间的一个下级名字空间里,它叫boost::filesytem。这里介绍几个代码中用到的函数。

boost::filesystem::path path("");//初始化

boost::filesystem::is_directory(file_path)//判断file_path是否为目录。
/**********GetDataDir()函数分析****************************/

1.png

GetDataDir函数流程图

2.png
总体来说:

如果有path路径,则直接返回这个路径;

如果没有,则查看参数gArgs中是否设置了路径,如果设置且正确(如果设置的是网络目录,则转换成本地路径),则在本地创建这个路径,并返回路径;如果设置但错误,则清空path,返回空目录;

其中的函数说明:

函数1,L558

pathCached ,pathCachedNetSpecific定义在util.cpp中,如下

void ClearDatadirCache()

{

LOCK(csPathCached);

pathCached =fs::path();

pathCachedNetSpecific = fs::path();

}
函数2, L566

path =fs::system_complete(gArgs.GetArg("-datadir", ""));
转化路径为完整路径,详见

https://msdn.microsoft.com/en-us/library/hh874650(v=vs.120).aspx

函数3,L572

GetDefaultDataDir()
定义在util.cpp.返回默认路径,那默认路径是什么呢?

// Windows

// Windows >= Vista:C:\Users\Username\AppData\Roaming\Bitcoin

// Mac:~/Library/Application Support/Bitcoin

// Unix:~/.bitcoin
函数4,L 575

BaseParams().DataDir();
其中BaseParams函数定义在chainparamsbase.cpp文件,函数定义如下

const CBaseChainParams& BaseParams()

{

assert(globalChainBaseParams);

return*globalChainBaseParams;

}
返回的是*globalChainBaseParams,定义也在这个文件里,

static std::unique_ptrglobalChainBaseParams;
由定义可以看出,BaseParams是类CBaseChainParams,我们看看类CBaseChainParams

class CBaseChainParams

{

public:

/** BIP70 chainname strings (main, test or regtest) */

static conststd::string MAIN;

static conststd::string TESTNET;

static conststd::string REGTEST;

conststd::string& DataDir() const { return strDataDir; }

int RPCPort()const { return nRPCPort; }

protected:

CBaseChainParams() {}

int nRPCPort;

std::stringstrDataDir;

};
其中,可以看到DataDir()函数定义:

const std::string& DataDir() const { returnstrDataDir; }
定义在chainparamsbase.cpp中:

const std::string& DataDir() const { returnstrDataDir; }
//类注释中,我们可以看到BIP70,说明这个改进协议BIP70中应用到的。
/**********GetDataDir()函数分析结束****************************/

区块链研习社比特币源码研读班 electroman

以下是广告:

我们区块链研习社已创建“区块链研习社币圈交流”小密圈”,在小密圈中,我们将带领大家一起学习区块链的原理与投资,还将提供区块链基本原理解答、交易所注册与交易操作、ICO交易与操作、投资分析、风险分析等内容。
区块链研习社币圈交流.png