YangW

无为,无我,无欲,居下,清虚,自然

关于编程中“绝对路径”和“相对路径”的使用

加载图片、音乐等各种文件的时候,都要指定文件路径。通常,可以用绝对路径和相对路径两种方式来指定文件。

先解释一下概念:

  • 绝对路径,就是从盘符开始的路径,例如:“c:\windows\system32\mfc42.dll”。
  • 相对路径,就是从当前路径开始的路径,例如,当前路径是“c:\windows”,那么指定前面范例的文件,可以直接写“system32\mfc42.dll”。
    注意,路径分隔符“\”在 c 语言里面是转义字符,所以表达路径分隔符需要用“\\”。

从功能上讲:

  • 访问每台电脑上路径都固定不变的文件,需要用绝对路径,例如访问 c:\boot.ini。
  • 如果程序所在路径不固定,访问的文件和程序放在一起,就要用相对路径。例如和程序放在一起的图片文件。

在 VC6 的项目中的使用范例:

先描述一下环境:

vc6的项目路径:c:\myprojects\easyx\

项目中的主要文件:

c:\myprojects\easyx\easyx.dsw
c:\myprojects\easyx\easyx.cpp
c:\myprojects\easyx\background.jpg
c:\myprojects\easyx\res\apple.jpg
c:\myprojects\easyx\Debug\easyx.exe
c:\myprojects\easyx\Release\easyx.exe

绝对路径的使用:

#include <graphics.h>
#include <conio.h>

void main()
{
	// 初始化绘图窗口
	initgraph(640, 480);

	// 加载图片到窗口
	loadimage(NULL, _T("c:\\myprojects\\easyx\\background.jpg"));

	// 加载图片到 img 对象并显示
	IMAGE img;
	loadimage(&img, _T("c:\\myprojects\\easyx\\res\\apple.jpg"));
	putimage(100, 100, &img);

	// 按任意键退出
	getch();
	closegraph();
}

对于这个范例,使用绝对路径编译后,无论 exe 程序放在哪里,图片路径都必须在“c:\myprojects\easyx\background.jpg”和“c:\myprojects\easyx\res\apple.jpg”。

对于相对路径的使用要注意:当前路径是项目路径,而不是 Debug 或 Release 路径。所以,图片要放在项目文件夹下,而不是 Debug 或 Release 文件夹里面。范例如下:

#include <graphics.h>
#include <conio.h>

void main()
{
	// 初始化绘图窗口
	initgraph(640, 480);

	// 加载图片到窗口
	loadimage(NULL, _T("background.jpg"));

	// 加载图片到 img 对象并显示
	IMAGE img;
	loadimage(&img, _T("res\\apple.jpg"));
	putimage(100, 100, &img);

	// 按任意键退出
	getch();
	closegraph();
}

对于这个范例,使用相对路径编译后,图片只需要和 exe 程序放在一起就可以。例如程序放在“f:\games\mygame\easyx.exe”,那么两个图片的路径就是“f:\games\mygame\background.jpg”和“f:\games\mygame\res\apple.jpg”。

再详细解释一下:

对于相对路径,是以当前路径开始。当前路径通常是 exe 程序所在路径,但也有例外,比如,在 vc6 中运行的编译后的 exe 程序,当前路径是 vc6 项目所在路径。另外,在 exe 的快捷方式里面可以修改当前路径。对于种种不确定性,有些程序会先获取 exe 所在的路径,然后通过字符串操作,将相对路径修改为绝对路径再使用。虽然使用相对路径并不是绝对可靠,但使用相对路径仍然是比较推荐的做法。