原标题:代码中文件路径要怎么写?
今天给大家分享在代码中如何获取文件的路径信息。
以我们搜狗输入法的项目为例,在单元测试过程中,需要读取词库文件sys.bin,以下为输入法工程的简易树形图:
├─core_project
├─test
│test .h│test .cpp
├─dict
├─android
│sys .bin
那么在单元测试代码test.cpp中如何读取sys.bin?
绝对路径 #defineKDictDir ("D:/project/dict/android")
在之后的代码中使用open函数读取文件:
open(KDictDir+ "sys.bin");
结果组内的小伙伴重新checkout代码就无法执行了,因为代码check路径不一样。
最low的方法,推荐级别:1颗星。
代码相对路径
#defineKDictDir ("../../dict/android")
以测试代码test.cpp的路径获取了词库的相对路径。
该方法依赖于当前工作目录的路径,小编在使用VS2017调试过程中可以正常执行,结果组内的小伙伴点击可执行文件Test.exe就无法正常运行了。原因是直接执行Test.exe,工作目录为Test.exe所在的文件夹,即"D:/project/core_project/Debug/test/",与VS调试时的工作目录"D:/project/core_project/"不同。
推荐级别:3颗星。
可执行文件相对路径
获取当前项目工程的可执行文件Test.exe路径,以此作为相对路径设置词库路径。
获取可执行文件路径方式,使用系统提供的GetModuleFileNameA()函数:
std::stringmodule_directory;
if(config_path.find(":") == std::string::npos) {
charmodule_name[MAX_PATH]; GetModuleFileNameA(CURRENT_MODULE(), module_name, MAX_PATH); module_directory = module_name;
size_tlast_backslash = module_directory.rfind('', module_directory.size());
if(last_backslash != std::string::npos) module_directory.erase(last_backslash + 1);}
然后设置:
#defineKDictDir ("../../../dict/android")
拼接完成之后得到词库的绝对路径:
D:/project/core_project/Debug/test/../../../dict/android
这样普通情况下是没有问题的。不过在开发使用Cmake工具管理项目之后,我们的单测也相应的使用Cmake管理,导致可执行文件的生成路径更加灵活,一旦路径变更,词库路径就无法正确获取了。
//以前的项目
├─core_project
├─Debug
├─test│Test.exe
//现在的项目
├─core_project
├─VS_build (存储所有编译文件的文件夹)├─test├─Debug
│Test.exe
推荐级别:3颗星。
Cmake + 配置文件
Cmake是一个跨平台的编译工具,因其简单易学功能强大被许多项目开发人员青睐,在Cmake工具中定义了一些常用的变量:
${CMAKE_SOURCE_DIR}项目顶层目录
${CMAKE_CURRENT_SOURCE_DIR}项目当前子项目的路径
${CMAKE_BINARY_DIR}项目顶层编译目录
${CMAKE_CURRENT_BINARY_DIR}项目当前子项目的编译路径
这些变量在执行中会转化为绝对路径,比如${CMAKE_SOURCE_DIR}在我的机器上标识"D:/project/core_project"。
最后我的解决方案结合了Cmake的特性和json文件的配置:
//config.json. in文件
{ "test": {
"dicts_path_a": "${CMAKE_SOURCE_DIR}/../dict/android/", }}
在CMakeList.txt文件生成配置文件config.json,Cmake语句描述如下:
configure_file(config.json.in${CMAKE_CURRENT_BINARY_DIR}/config.json)
生成的config.json文件如下:
//config.json 文件
{ "test": {
"dicts_path_a": "D:/project/core_project/../dict/android/", }}
由于CMakeLists.txt文件位置固定,所有以它为参考来获取绝对路径就能保证万无一失了。且该方法支持跨平台,能与Cmake工具灵活配合,推荐级别:5颗星。返回搜狐,查看更多
责任编辑: