我有一个项目,我想要读取包含特定文件夹中的数据的文件。我有一个脚本文件来执行程序,这个脚本文件可以放在计算机上的任何地方,因此我不能在程序中使用函数getcwd来获取我的数据文件的路径。我的问题是,C中是否有可能从目标文件所在的位置获取路径。即不是脚本的运行位置?
实施例: 启动脚本目录:/home/user/my_files/scripts/start_script.sh 主程序目录:/ home / user / project /
答案 0 :(得分:1)
在脚本中,您可以执行cd <specific dir>
,然后使用绝对路径启动二进制文件。
cd <specific dir>
/home/user/project/main
然后在main
中,您可以getcwd()
将<specific dir>
返回main
。
不,没有便携式方法可以从main
中获取main
所在的路径。
答案 1 :(得分:1)
@Matthias给出了一个问题的链接,其中详细讨论了查找可执行位置的各种方法。
我可以再添加一个。
安装程序时,可以将路径直接嵌入可执行文件中。
例如,在程序中,您可以定义类似这样的数组:
char ExecutablePath[16 + 1024] = "&Unique#!%Stuff~";
其中前16个字符形成一个独特的序列,不会出现在程序中的任何其他位置,而最后的1024个字符包含路径,最初是未知的。
在安装过程中,您可以在可执行文件中查找此序列的唯一字符,一旦找到,就可以在其后立即将路径写入文件。
如果操作系统对其进行验证,您可能需要调整文件的校验和(Windows似乎并不关心)。
答案 2 :(得分:0)
如果我错了,请纠正我,看起来你可以使用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);
}