Java C、 打开与可执行文件相关的文件';这条路怎么走?
我想修复一个使用相对路径加载数据文件的旧C程序(获得了源代码),希望从放置该程序的目录调用该可执行文件,例如Java C、 打开与可执行文件相关的文件';这条路怎么走?,java,c,linux,path,getresource,Java,C,Linux,Path,Getresource,我想修复一个使用相对路径加载数据文件的旧C程序(获得了源代码),希望从放置该程序的目录调用该可执行文件,例如LoadEx(“./dataFile”,dataFile)当然,从另一个目录调用程序失败,因为无法加载数据文件 如何修改C程序以相对于可执行文件的目录加载数据文件 编辑: 我原来的问题变得不适用,因此至少是重复的: - - -为什么不想要readlink(“/proc/self/exe”)?这是在linux上查找可执行文件路径的方式 唯一的其他方法是使用getenv()从环境中提取路径
LoadEx(“./dataFile”,dataFile)
当然,从另一个目录调用程序失败,因为无法加载数据文件
如何修改C程序以相对于可执行文件的目录加载数据文件
编辑:
我原来的问题变得不适用,因此至少是重复的:
-
-
-为什么不想要readlink(“/proc/self/exe”)
?这是在linux上查找可执行文件路径的方式
唯一的其他方法是使用getenv()
从环境中提取路径,并遍历路径目录,查找argv[0]的匹配项。第一种选择要容易得多
或者先在可执行文件上执行一个,并将结果作为命令行参数或类似的技巧传入,然后编写一个脚本来启动程序。您列出的Java方法不会读取与正在执行的Java类相关的资源,而是相对于其类路径。您完全正确。我误解了Java中ClassLoader
的工作原理。既然如此,我原来的问题就不适用了。。。那么我想除了用proc
查找绝对路径或通过配置设置绝对路径之外,没有其他方法了。在这种情况下,我的问题变成了另一个问题的重复。C代码中的argv[0]参数到main函数应该有完整的文件名和可执行文件的路径。假设您有一个主函数,并且没有删除args。谢谢。我想我觉得依赖于一个特定操作系统的这么多细节而不能使用一个更标准的解决方案是非常难看的。如果我想在更多的操作系统上运行它,我必须检查proc
或argv[0]
或$PATH
或GetModuleFileName
,如中所示,但可能就是这样做的?文件系统依赖于操作系统。并非所有操作系统都有文件系统!你能做什么,这是一个不完美的世界。如果它能让人们更容易接受这一点的话,那很可能Java也在暗地里做着同样的事情。@obserobot当然,但是,在我看来,一种语言可以很容易地为标准操作系统提供一个库。C语言是为实现操作系统而设计的,所以“标准”操作系统的想法是毫无意义的。Kernighan和Ritchie从来没有想到Unix会像它那样流行(Linus也没有想到,当他开始使用Linux时)。