Linux上使用程序相对路径访问文件【转】

转自:http://blog.csdn.net/yinxusen/article/details/7444249

今天一个朋友问我这个问题,说为什么在Windows上跑得很好的应用程序,移植到Linux上后就读不到跟应用程序在同一文件夹下的文件呢,我说,这是linux和Windows在Work directory上设置的不同。
大家都知道,对于Windows而言,应用程序的默认工作目录就是应用程序所在的目录,它一般是不管应用程序是从哪个目录上下文启动的。那么在不更改工作目录的情况下,读文件使用相对目录就肯定是相于应用程序所在的目录。
但对于Linux而言,应用程序的默认工作目录就不同了,它是默认是继承启动它的进程的工作目录的,也就是说,如果进程是在其它目录下启动,那应用程序的工作目录默认就在其它的目录下。这样的话使用相对路径访问文件就有很大的不确定性:我们永远也不能保证,用户一定是从应用程序所在的目录启动!
那要怎么解决呢,我给的建议是,在程序启动后,修改应用程序的当前目录到应用程序所在的目录,然后其它所有程序都无须改动。最好的办法当然只有一个,那就是通过main函数传入的argv[0]计算出当前目录。
下面的例子是读取跟应用程序所在同一目录的a.txt文件并显示,程序启动后修改当前工作目录为应用程序所在的目录,所以不管应用程序从哪个目录启动,程序都能正确地读到a.txt这个文件。
01
#include <stdio.h>
02
#include <string.h>
03
#include <libgen.h>
04
#include <unistd.h>
05

06
void main(int argc,char* argv[]){
07
    char buf[256];
08
    chdir(dirname(argv[0])); //设置当前目录为应用程序所在的目录。其实,就只要加入这一句,就可以使用windows一样的方式用相对路径打开文件了!
09
    FILE* fp=fopen("./a.txt","r");
10
    if(fp==NULL){
11
        printf("Can't read file ./a.txt\n");
12
        return;
13
    }
14
    fread(buf,255,1,fp);
15
    fclose(fp);
16
    printf("%s\n",buf);
17
}
在shell中同样可以保证使用相对路径,同样的,$0参数是调用命令,使用`dirname $0`,可取得shell脚本的真实路径.cd到这个路径后也可以使用相对路径了.

 

时间: 2024-09-26 01:43:16

Linux上使用程序相对路径访问文件【转】的相关文章

在Linux上使用logwatch分析监控日志文件

1. 介绍 在维护Linux服务器时,经常需要查看系统中各种服务的日志,以检查服务器的运行状态. 如登陆历史.邮件.软件安装等日志.系统管理员一个个去检查会十分不方便:且大多时候,这会是一种被动的检查,即只有在发现系统运行异常时才会想到去查看日志以获取异常的信息.那么如何主动.集中的分析这些日志,并产生报告,定时发送给管理员就会显得十分重要. logwatch 是一款用 Perl 语言编写的开源日志解析分析器.它能对原始的日志文件进行解析并转换成结构化格式的文档,也能根据您的使用情况和需求来定制

Linux上使用logwatch分析监控日志文件

1. 介绍 在维护Linux服务器时,经常需要查看系统中各种服务的日志,以检查服务器的运行状态. 如登陆历史.邮件.软件安装等日志.系统管理员一个个去检查会十分不方便:且大多时候,这会是一种被动的检查,即只有在发现系统运行异常时才会想到去查看日志以获取异常的信息.那么如何主动.集中的分析这些日志,并产生报告,定时发送给管理员就会显得十分重要. logwatch 是一款用 Perl 语言编写的开源日志解析分析器.它能对原始的日志文件进行解析并转换成结构化格式的文档,也能根据您的使用情况和需求来定制

【Tomcat】Linux上Tomcat发布-JavaWeb项目-访问时不通过项目名

转载请注明出处:http://blog.csdn.net/qq_26525215 本文源自[大学之旅_谙忆的博客] 一开始自己不知道怎么直接通过域名访问到自己部署的Web项目,发布在Tomcat上的. 因为自己以前写都是后面加了项目名, 然后去百度谷歌,找到了下面的正确方法 如果你不想输入端口号访问,记得把端口号8080改为80哦. apache-tomcat-7.0.73/conf/server.xml文件中 1.把项目名改成ROOT即可(如果有先删除之前的ROOT项目) 2.修改tomcat

Linux上设置用户通过SFTP访问目录的权限的方法

  sftp和ftp是两种协议是不同的,sftp是ssh内含的协议,只要sshd服务器启动了,它就可用,它本身不需要ftp服务器启动. 1.查看openssh软件版本,想sftp服务用户只能访问特定的文件目录,版本需要4.8以上 代码如下: [root@localhost ftp]# rpm -qa | grep openssh openssh-server-5.3p1-81.el6_3.x86_64 openssh-5.3p1-81.el6_3.x86_64 openssh-clients-5

Linux下Apache支持中文路径或文件配置

下载一个模块    代码如下 复制代码 wget ftp://ftp.aconus.com/fc5/mod_encoding/mod_encoding-2.2.0-1.i386.tar.gz tar zxf mod_encoding-2.2.0-1.i386.tar.gz rpm -ivh mod_encoding-2.2.0-1.i386.rpm 重启apache  代码如下 复制代码 /etc/init.d/httpd restart 报错如下  代码如下 复制代码 httpd: Synta

Linux 上的基础网络设备详解

Linux 抽象网络设备简介 和磁盘设备类似,Linux 用户想要使用网络功能,不能通过直接操作硬件完成,而需要直接或间接的操作一个 Linux 为我们抽象出来的设备,既通用的 Linux    网络设备来完成.一个常见的情况是,系统里装有一个硬件网卡,Linux 会在系统里为其生成一个网络设备实例,如 eth0,用户需要对 eth0    发出命令以配置或使用它了.更多的硬件会带来更多的设备实例,虚拟的硬件也会带来更多的设备实例.随着网络技术,虚拟化技术的发展,更多的高级网络设备被加入了到了

web服务部署到linux上后,文件上传路径如何修改呢?

问题描述 web服务部署到linux上后,文件上传路径如何修改呢? 在windows下开发的时候,我的文件上传保存路径为 d:/www/xx/,项目部署到linux上后,应该如何修改上传路径呢?如果不修改,我发现也可以上传,但是文件会上传到tomcat7/bin/目录中,给人感觉非常混乱.我希望能放在指定的文件夹中.谢谢! 解决方案 参考:http://www.enkj.com/help/newscontent/70983 你的路径用 /upload/xxx 就会根据你定义的目录相对路径找到 解

求助: 布署项目到远程linux上的tomcat上.布署成功后,访问不到jsp,静态资源文件也访问不到. 报404错误.

问题描述 求助:布署项目到远程linux上的tomcat上.布署成功后,访问不到jsp,静态资源文件也访问不到.报404错误.20分钟前匿名|分类:JAVA相关|浏览3次求助:布署项目到远程linux上的tomcat上.布署成功后,访问不到jsp,静态资源文件也访问不到.报404错误.项目MVC层用的是struts2,在web.xml中配置的Struts2的.如果我将web.xml文件中的struts2的配置删除掉.这时就可以访问到静态的资源文件,也可以直接访问JSP文件了.但是这样STRUTS

在Mac Linux上如何快速判断一个文件是否是恶意程序?

熟悉Mac/Linux的用户经常会使用命令行,如果遇到系统异常,如CPU使用率暴涨等,经常会使用top命令去定位到底是哪个程序出现了异常.找到相关程序后,由于许多用户自身没有安全背景或者不大懂得逆向,便无法去分析程序到底做了什么,不敢枉然kill掉程序.又如果文件夹下面无故多了非自己创建的程序,这时也不敢枉然删除.针对这一情况,本文介绍几种小技巧,让你快速判断一个程序是否是恶意样本. 1.使用file命令快速识别文件类型   如图使用file命令识别名为bashd的文件,从结果中可以看出这个文件