c语⾔中⽂件路径怎么写,代码中⽂件路径要怎么写?
原标题:代码中⽂件路径要怎么写?
今天给⼤家分享在代码中如何获取⽂件的路径信息。
以我们搜狗输⼊法的项⽬为例,在单元测试过程中,需要读取词库⽂件sys.bin,以下为输⼊法⼯程的简易树形图:
├─core_project
├─test
│test .h│test .cpp
├─dict
├─android
│sys .bin
那么在单元测试代码test.cpp中如何读取sys.bin?
绝对路径 #defineKDictDir ("D:/project/dict/android")
在之后的代码中使⽤open函数读取⽂件:cmake如何使用
open(KDictDir+ "sys.bin");
结果组内的⼩伙伴重新checkout代码就⽆法执⾏了,因为代码check路径不⼀样。
最low的⽅法,推荐级别:1颗星。
代码相对路径
#defineKDictDir ("../../dict/android")
以测试代码test.cpp的路径获取了词库的相对路径。
该⽅法依赖于当前⼯作⽬录的路径,⼩编在使⽤VS2017调试过程中可以正常执⾏,结果组内的⼩伙伴点击可执⾏⽂件就⽆法正常运⾏了。原因是直接执⾏,⼯作⽬录为所在的⽂件夹,即"D:/project/core_project/Debug/test/",与VS调试时的⼯作⽬录"D:/project/core_project/"不同。
推荐级别:3颗星。
可执⾏⽂件相对路径
获取当前项⽬⼯程的可执⾏⽂件路径,以此作为相对路径设置词库路径。
获取可执⾏⽂件路径⽅式,使⽤系统提供的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) ase(last_backslash + 1);}
然后设置:
#defineKDictDir ("../../../dict/android")
拼接完成之后得到词库的绝对路径:
D:/project/core_project/Debug/test/../../../dict/android
这样普通情况下是没有问题的。不过在开发使⽤Cmake⼯具管理项⽬之后,我们的单测也相应的使⽤Cmake管理,导致可执⾏⽂件的⽣成路径更加灵活,⼀旦路径变更,词库路径就⽆法正确获取了。
//以前的项⽬
├─core_project
├─Debug
├─test│
//现在的项⽬
├─core_project
├─VS_build (存储所有编译⽂件的⽂件夹)├─test├─Debug
│
推荐级别: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/", }}
在⽂件⽣成配置⽂件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/", }}
由于⽂件位置固定,所有以它为参考来获取绝对路径就能保证万⽆⼀失了。且该⽅法⽀持跨平台,能与Cmake⼯具灵活配合,推荐级别:5颗星。返回搜狐,查看更多
责任编辑:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论