分清程序“所在路径”和“执行路径”

2006/09/14 | 21:49 | 分类:Windows开发 | 标签: | 729次阅读

  我的一个程序在执行时需要调用其所在路径下的数据文件。这个程序在独立运行时没有问题,但用第三方程序将其作为子进程加载后,却发生了无法找到数据文件的错误。其原因:我是通过相对路径查找数据文件的,在由第三方程序调用该程序时,执行路径是第三方程序所在路径,所以无法通过原相对路径找到数据文件。因此,我们有必要明确程序的“所在路径”和“执行路径”,才能正确地处理相对路径文件引用。

  下面给出C、C#和Python中,获取程序“所在路径”和“执行路径”的方法。其中的C程序只在Windows下有效,在Linux下缺乏现成的函数,需要“曲线”现实,可参见coldcrane的专栏《Linux下GetModuleFileName的四种写法》一文。

  1. #include <stdio.h>
  2. #include <windows.h>
  3.  
  4. #define MAXPATH 256
  5.  
  6. int main()
  7. {
  8.     char str[MAXPATH];
  9.  
  10.     GetModuleFileName(NULL, str, MAXPATH);
  11.     *(strrchr(str, '\\')) = '\0';
  12.     printf("The program is in: %s\n", str);
  13.  
  14.     getcwd(str, MAXPATH);
  15.     printf("The program runs at: %s\n", str);
  16.  
  17.     return 0;
  18. }
  1. using System;
  2.  
  3. namespace CSharp
  4. {
  5.     class Program
  6.     {
  7.         static void Main(string[] args)
  8.         {
  9.             string str;
  10.  
  11.             str = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;
  12.             str = str.Substring(0, str.LastIndexOf("\\"));
  13.             Console.WriteLine("The program is in: " + str);
  14.  
  15.             str = System.IO.Directory.GetCurrentDirectory();
  16.             Console.WriteLine("The program runs at: " + str);
  17.         }
  18.     }
  19. }
  1. #!/usr/bin/python
  2.  
  3. import os
  4.  
  5. if __name__ == '__main__':
  6.     print "The program is in: %s" % os.path.dirname(__file__)
  7.     print "The program runs at: %s" % os.getcwd()

  附:Windows下简单测试的方法。在以上代码末尾添加诸如getchar()一类的暂停效果指令,编译之(当然Python就不用了),对生成的可执行文件建立快捷方式,修改快捷方式的属性,将“Start in(起始位置)”设为有别于程序所在路径的其它位置。运行这个快捷方式,观察“The program is in:”与“The program runs at:”的不同。

相关文章

发表您的评论

您的名字: (必填)

您的邮箱: (不会被公布,必填)

您的网站:

* 正确填写邮箱可支持Gravatar头像服务。
* 与主题无关的内容请用邮件或IM与我联系。