c语言中文件路径怎么写,代码中文件路径要怎么写?

原标题:代码中文件路径要怎么写?

今天给大家分享在代码中如何获取文件的路径信息。

以我们搜狗输入法的项目为例,在单元测试过程中,需要读取词库文件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颗星。返回搜狐,查看更多

责任编辑:

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值