相对路径 与 绝对路径之间的转换

时间:2022-11-27 18:14:09

起因是在使用NCFTP下载文件时发现它不支持本地相对路径,还需要手动将相对路径转换为绝对路径,于是考虑了一下相对路径与绝对路径之间的转换,想到的有以下几种方法:

1. 字符串解析

这种方式就是要通过路径的规则对路径字符串是行处理,这种方式是性能最好的一种方式,但实现起来比较麻烦。

2. 使用现成API

在windows系统中可以通过API函数etFullPathName() 和PathRelativePathTo()进行转换

而在linux/Unix系统中没有类似函数(至少我现在还没有发现),但是可以通过一些技巧实现,相对路径转绝对路径的伪码如下:
1: cwd = getcwd( );       // backup
2: chdir(relPath);          
3: absPath = getcwd( );
4: chdir( cwd);              // restore
该方法可以跨平台,但是有一个缺陷,就是在第2步和第4步之间可能出现竞争,因为此时程序的当前工作目录被置到一个未知的目录,在多线程环境中如果存在依赖当前工作目录的行为,可能产生不可预知的结果。这种方式如果是在单线程环境下工作是安全的,如果是在多线程环境,并且并发程度不是很高的情况下也可以使用,但存在风险。

而对于绝对路径到相对路径的转换,暂时还没有类似的方法。

3.使用命令行

通过管道popen/pclose执行一些shell命令,也可以达到相对路径到绝对路径的转换,伪码如下:

1: pf = popen(“cd relPath;pwd”);
2: absPath = fgets( pf );
3: pclose(pf);

这种方法其实与第2种的原理是相同的,但是解决了第二种存在竞争风险的问题,但牺牲了一些性能,因为这种方法是通过产生新的进程来实现的,进程的产生与销毁代价是比较高的。该方法的另一个缺陷是跨平台问题,只能在Unix/Linux系统上使用,不能在windows平台上使用。

这三种方法各有优缺点,如果对软件可性、性能要求比较高的情况下还是使用方法1比较好,当然成本也是最高的。如果仅在Unix/Linux平台上使用,则推荐使用第3种方法,虽然牺牲了一些性能,但它可以保证软件的行为的可控性;如果要求跨平台,第3种方法就不如第2种方法了,它保证了代码的可移植,但需要注意避开竞争条件。