配置文件使用绝对路径还是相对路径?

配置文件使用绝对路径还是相对路径?

 

起因:

   今天碰到一个问题,在程序ProcessA使用CreateProcess启动另一个程序——ProcessB时,CreateProcess有一个参数为

lpCurrentDirectory:
The full path to the current directory for the process. The string can also specify a UNC path. If this parameter is NULL, the new process will have the same current drive and directory as the calling process. (This feature is provided primarily for shells that need to start an application and specify its initial drive and working directory.)

我本将该参数设置为NULL,但是发现ProcessB在启动后不对,后来发现由于lpCurrentDirectory设置为NULL,ProcessB中对于配置文件的位置查找是根据创建者ProcessA的可执行文件A.exe路径查找的,而ProcessB对应的可执行文件B.exe和A.exe的路径没有关系,那么ProcessB中对于配置文件的查找是使用的相对路径,而该相对路径是和进程上下文相关,这里路径的查找上下文被设置成了A.exe所在的路径,那么ProcessB变找不到该路径;

解决:
解决上述问题的办法:
1. 将lpCurrentDirectory设置为B.exe所在的目录路径;
2. ProcessB中读取配置文件的路径应设置为绝对路径,含使用系统API获取B.exe所在目录路径将相对路径补为绝对路径;

延伸:
配置文件是经常使用的一种使得程序可静态配置的方法,通常我们都习惯直接使用相对路径作为配置文件的读取路径,并且将配置文件放置在和可执行文件同一目录或子目录;
当相对路径在这里的好处仅仅是提供了程序编写上的方便时,个人建议还是使用绝对路径(动态获得可执行文件路径后补足),这样可以保证读取的是我们真正想要的配置文件;
否则,采用相对路径时,除了上面可能由于CreateProcess调用或者ShellExecute调用导致的问题之外,还有开机自启动时,程序的上下文环境通常是启动的用户的目录,这时,如果不清楚,你会发现程序莫名其妙的失败;

而当我们想要的确实就是相对路径时,比如不同的用户使用不同的配置或者由父进程决定配置文件的路径时,我们就只能使用相对路径;
不过目前我还没有碰到过必须使用相对路径的情况,碰到后再来补充;

ToDo:
使用相对路径的情况补充;

 

 

 

 
 

你可能感兴趣的:(String,api,null,application,Path)