起因是在使用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种方法了,它保证了代码的可移植,但需要注意避开竞争条件。