我有一个项目,我想读取一个包含特定文件夹中数据的文件。我有一个脚本文件来执行程序,这个脚本文件可以位于计算机上的任何位置,因此我不能在程序中使用函数 getcwd 来获取我的数据文件的路径。我的问题是,C 中是否有可能从目标文件所在的位置获取路径。即不是从哪里运行脚本?
示例:启动脚本目录:/home/user/my_files/scripts/start_script.sh 主程序目录:/home/user/project/
在脚本中,您可以执行cd <specific dir>
然后使用绝对路径启动二进制文件。
cd <specific dir>
/home/user/project/main
那么在main
你很好可以做一个getcwd()
已经<specific dir>
返回main
。
不,没有便携式方法可以main
从main
.
@Matthias 给出了一个问题的链接,其中很好地讨论了查找可执行位置的各种方法。
我可以再加一个。
安装程序时,您可以将路径直接嵌入到可执行文件中。
例如,在程序中,您可以定义一个数组,如下所示:
char ExecutablePath[16 + 1024] = "&Unique#!%Stuff~";
其中前 16 个字符形成一个唯一序列,不会出现在程序的其他任何地方,最后 1024 个字符包含路径,最初是未知的。
在安装过程中,您在可执行文件中查找此唯一字符序列,一旦找到,您就将路径写入文件中。
如果操作系统对其进行验证,您可能需要调整文件的校验和(Windows 似乎并不关心)。
如果我错了,请纠正我,看起来你可以使用argv[0]
.
int main(int argc, char** argv)
{
printf("Name of executable: %s\n", argv[0]);
/* extract everything before first '/' from argv[0] */
char buffer[SomeLargeNumber];
char* ptr = argv[0] + strlen(argv[0]) - 1;
while(*ptr != '/' && ptr != argv[0]) { ptr--; }
int len = ptr - argv[0];
memcpy(buffer, argv[0], len);
buffer[len] = '/';
buffer[len + 1] = 0;
return printf("Directory: %s\n", buffer);
}