我决定发布应该是可行的解决方案。它涉及“正确”修复代码以使用绝对路径,但请耐心等待。这并不难。OP发布的答案太危险了。它一点也不“便宜”。相反,从长远来看,它可能会非常昂贵。
现在我假设在代码中散布着函数/方法调用,它们通过相对路径名(很可能是不合格的文件名)访问文件或文件夹。可能有很多这些,但它们可能都归结为:
do_something_with_this_file ("somefile.foo");
现在,如果do_something_with_this_file
是在应用程序中定义的函数,则解决方案很明显:更改该函数的实现以将传入的参数转换为绝对路径名(如有必要),然后再对其进行任何操作。
但生活不是那么容易,如果do_something_with_this_file
是一个电话CreateFile
或也许fopen
。然后我们被该函数的现有行为所困扰。还是我们?实际上,没有。有一个简单的解决方案,只涉及一个宏和少量的实现工作。
是时候举个例子了。我会使用fopen
它,因为它有一个很好的简单 API,但它同样适用于CreateFile
其他任何东西。
首先,创建一个头文件,让我们调用它AbsolutePathHelpers.h
,它重新定义fopen
,以及您需要的任何其他内容,如下所示:
// AbsolutePathHelpers.h
FILE *APHfopen (const char *filename, const char *mode);
#define fopen APHfopen
// ...
确保这个头文件被包含在你的所有编译单元中,可能是#include
通过将它放在他们都使用的一些通用头文件中。
APHfopen
现在在一个新的 .cpp 文件(我们称之为)中编写实现AbsolutePathHelpers.cpp
,您需要将其与您的项目链接:
// AbsolutePathHelpers.cpp
#include <stdio.h>
#undef fopen
FILE *APHfopen (const char *filename, const char *mode)
{
printf ("Opening %s\n", filename); // diagnostic message for testing
// Convert filename to absolute path here (if necessary) before calling the 'real' fopen
return fopen (filename, mode);
}
// ...
最后是一个简单的测试程序:
// Test program
#include <stdio.h>
int main ()
{
FILE *f = fopen ("myfile", "r");
if (f)
fclose (f);
printf ("Finished. Press any key...");
getchar ();
return 0;
}
输出:
Opening myfile
Finished. Press any key...
在Wandbox运行它。
我将把将相对路径转换为绝对路径的细节留给 OP。您所需要的只是一个包含程序启动时生效的当前目录的全局变量。或者,我强烈怀疑,这实际上应该是包含可执行文件的目录。