Linux上使用程序相对路径访问文件【转】
转自:http://blog.csdn.net/yinxusen/article/details/7444249
今天一个朋友问我这个问题,说为什么在Windows上跑得很好的应用程序,移植到Linux上后就读不到跟应用程序在同一文件夹下的文件呢,我说,这是linux和Windows在Work directory上设置的不同。
大家都知道,对于Windows而言,应用程序的默认工作目录就是应用程序所在的目录,它一般是不管应用程序是从哪个目录上下文启动的。那么在不更改工作目录的情况下,读文件使用相对目录就肯定是相于应用程序所在的目录。
但对于Linux而言,应用程序的默认工作目录就不同了,它是默认是继承启动它的进程的工作目录的,也就是说,如果进程是在其它目录下启动,那应用程序的工作目录默认就在其它的目录下。这样的话使用相对路径访问文件就有很大的不确定性:我们永远也不能保证,用户一定是从应用程序所在的目录启动!
那要怎么解决呢,我给的建议是,在程序启动后,修改应用程序的当前目录到应用程序所在的目录,然后其它所有程序都无须改动。最好的办法当然只有一个,那就是通过main函数传入的argv[]计算出当前目录。
下面的例子是读取跟应用程序所在同一目录的a.txt文件并显示,程序启动后修改当前工作目录为应用程序所在的目录,所以不管应用程序从哪个目录启动,程序都能正确地读到a.txt这个文件。 #include <stdio.h> #include <string.h> #include <libgen.h> #include <unistd.h> void main(int argc,char* argv[]){ char buf[]; chdir(dirname(argv[])); //设置当前目录为应用程序所在的目录。其实,就只要加入这一句,就可以使用windows一样的方式用相对路径打开文件了! FILE* fp=fopen("./a.txt","r"); if(fp==NULL){ printf("Can't read file ./a.txt\n"); return; } fread(buf,,,fp); fclose(fp); printf("%s\n",buf); }
在shell中同样可以保证使用相对路径,同样的,$0参数是调用命令,使用`dirname $`,可取得shell脚本的真实路径.cd到这个路径后也可以使用相对路径了.
Linux上使用程序相对路径访问文件【转】的更多相关文章
- linux上搭建nginx+ftp,实现文件的上传与访问
ftp服务器搭建 1.新建用户ftpuser并指定主目录为/home/ftpuser (注意:这个目录是后面存储和读取文件的目录) <!--创建用户并指定主目录--> useradd -d ...
- linux上应用程序的执行机制
linux上应用程序的执行机制 执行文件是如何在shell中被"执行"的.本文中尽可能少用一些源码,免得太过于无 聊,主要讲清这个过程,感兴趣的同学可以去查看相应的源码了解更多的信 ...
- Linux 上 C 程序的内存布局
在仔细研究这个问题之前,我认为 C 程序在内存中只有代码段,堆和栈三部分构成.前几天面试被问到了这个问题,才发现自己的印象是不完全的. 在本文中通过解析析一个 C 程序中变量和函数的地址来分析 C 程 ...
- Linux上java程序的jar包启动通用脚本(稳定用过)
Linux上java程序的jar包启动通用脚本如下: #! /bin/sh export LANG="zh_CN.GBK" SERVICE_NAME=` .sh` SCRIPT_N ...
- 解决Linux上tomcat启动却无法访问
linux中tomcat的安装 安装tomcat前首先要安装对应的jdk并配置Java环境 下载tomcat安装包 下载路径:https://tomcat.apache.org/download-80 ...
- Linux删除其他程序正在使用的文件
今天在逛论坛时发现网友提的一个问题: 今天做实验发现,当前活动日志丢失后,数据库居然还可以正常写数据,还可以正常提交,如果是ORACLE,这个时候数据库已经崩溃了,很奇怪DB2这个时候把事务写到哪儿去 ...
- linux上启动tomcat远程不能访问
linux上关闭防火墙同样访问不了,执行iptables -f即可. 你试一试这个“iptables -F”然后再访问,如果能够访问了,那么需要执行“firewall-cmd --add-port=8 ...
- java中构建同时兼容linux和windows程序时遇到的文件路径分割符问题解决方案
最近在做一个自动上传文件的客户端,因为 file.getAbsolutePath() 在Mac和linux下的分割符是“/”,而在windows操作系统下的分割符则是“\”,我们程序中固然可以通过调 ...
- linux上如何让other用户访问没有other权限的目录
目前遇到一个问题,一个other用户要访问一个目录,他需要在这个目录下创建文件,因此这个目录需要一个写权限,于是就给了这个目录777的权限,这样这个权限有点太大了,很容易出现安全问题,那我们应该怎么办 ...
随机推荐
- Python 3基础教程23-多维列表
这里简单举例一个多维列表,多维看起来都很晕. # 多维列表 x = [ [5,6],[6,7],[7,2] ,[2,5] ,[4,9]] print(x) # 根据索引引用列表元素,例如打印[6,7] ...
- 小程序开发时PC端调试返回结果和手机端IOS不一致问题
IOS11登录时遇到一个请求与PC返回不一致情况, 在小程序调试时IOS上始终没有wx.request() 不能发送请求 尝试解决方法 打开微信小程序调试的设置, 将TLS设为可信任的域名 设置 -- ...
- Daily Scrum02 12.01
今天是2013年12月的第一天,希望大家都有一个新的开始,一起努力! Member Today's Task Tomorrow's Task 李孟 Task 856: 熟悉单元测试方法熟悉单元 ...
- SQL SERVER 时间相关操作笔记
1.DATEADD函数: A. MSDN上的示例:http://msdn.microsoft.com/zh-cn/library/ms186819%28v=sql.90%29.aspx
- 利用java中的BigInteger实现进制转换
[原创] java中的进制BigInteger十分的强大,而且好用,他可以表示任意大的整数,同时还可以进行进制转换,十分的方便, 代码示例: package com.jiajia.demo_1; im ...
- [转]dojo/mouse
dojo/mouse Authors:Kris Zyp Project owner:Kris Zyp since:1.7.0 Contents Usage enter leave mouseButto ...
- iOS进阶--提高XCode编译速度、Xcode卡顿解决方案
提升编译链接的速度主要有以下三个方式: 1. 提高XCode编译时使用的线程数 defaults write com.apple.Xcode PBXNumberOfParallelBuildSubta ...
- Flash by sshockwave [树dp]
题目 给定一棵树,每个点有一个活动时间,长度为正整数$t_i$ 你需要安排每个点的活动时间什么时候开始什么时候结束,并且满足:任何一个时刻没有两个相邻的点都在活动 开始时刻为0,在以上条件下最小化所有 ...
- 导致SQL执行慢的原因
索引对大数据的查询速度的提升是非常大的,Explain可以帮你分析SQL语句是否用到相关索引. 索引类似大学图书馆建书目索引,可以提高数据检索的效率,降低数据库的IO成本.MySQL在300万条记录左 ...
- 线程 condition_variable
http://www.cnblogs.com/haippy/p/3252041.html 理解wait():当前线程调用 wait() 后将被阻塞(此时当前线程应该获得了锁(mutex).在线程被阻塞 ...