Linux上使用程序相对路径访问文件
2012-04-10 10:33
288 查看
今天一个朋友问我这个问题,说为什么在Windows上跑得很好的应用程序,移植到Linux上后就读不到跟应用程序在同一文件夹下的文件呢,我说,这是Linux和Windows在Work directory上设置的不同。
大家都知道,对于Windows而言,应用程序的默认工作目录就是应用程序所在的目录,它一般是不管应用程序是从哪个目录上下文启动的。那么在不更改工作目录的情况下,读文件使用相对目录就肯定是相于应用程序所在的目录。
但对于Linux而言,应用程序的默认工作目录就不同了,它是默认是继承启动它的进程的工作目录的,也就是说,如果进程是在其它目录下启动,那应用程序的工作目录默认就在其它的目录下。这样的话使用相对路径访问文件就有很大的不确定性:我们永远也不能保证,用户一定是从应用程序所在的目录启动!
那要怎么解决呢,我给的建议是,在程序启动后,修改应用程序的当前目录到应用程序所在的目录,然后其它所有程序都无须改动。最好的办法当然只有一个,那就是通过main函数传入的argv[0]计算出当前目录。
下面的例子是读取跟应用程序所在同一目录的a.txt文件并显示,程序启动后修改当前工作目录为应用程序所在的目录,所以不管应用程序从哪个目录启动,程序都能正确地读到a.txt这个文件。
在shell中同样可以保证使用相对路径,同样的,$0参数是调用命令,使用`dirname $0`,可取得shell脚本的真实路径.cd到这个路径后也可以使用相对路径了.
大家都知道,对于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 | } |
相关文章推荐
- Linux上使用程序相对路径访问文件【转】
- Microsoft Excel 不能访问文件“ 文件名称或路径不存在。 • 文件正被其他程序使用。 • 您正要保存的工作簿与当前打开的工作簿同名。
- Microsoft Excel 不能访问文件“ 文件名称或路径不存在。 • 文件正被其他程序使用。 • 您正要保存的工作簿与当前打开的工作簿同名。
- 在Linux下获取当前运行程序可执行文件全路径(不使用real_path()函数)
- JSP页面中如何使用相对路径访问文件
- 解决python模块调用时代码中使用相对路径访问的文件,提示文件不存在的问题
- Microsoft Excel 不能访问文件“ 文件名称或路径不存在。 • 文件正被其他程序使用。 • 您正要保存的工作簿与当前打开的工作簿同名。
- Microsoft Excel 不能访问文件“ 文件名称或路径不存在。 • 文件正被其他程序使用。 • 您正要保存的工作簿与当前打开的工作簿同名。
- 使用 /proc 文件系统来访问 Linux 内核的内容
- Windows Azure Storage Emulator: 另一程序正在使用此文件进程无法访问
- C# System.IO.FileStream 读取被其他程序打开的文件提示“文件正由另一进程使用,因此该进程无法访问该文件。”
- JAVA 使用相对路径读取文件
- 使用 /proc 文件系统来访问 Linux 内核的内容
- 转载:IIS7出现“另一个程序正在使用此文件,进程无法访问”
- 使用 /proc 文件系统来访问 Linux 内核的内容
- 使用 /proc 文件系统来访问 Linux 内核的内容
- 批处理运行遇到“另一个程序正在使用此文件,进程无法访问”
- 在Linux程序中如何获得本进程的可执行文件的全路径?
- Linux 文件系统剖析: 使用 /proc 文件系统来访问 Linux 内核的内容 这个虚拟文件系统在内核空间和用户空间之间打开了一个通信窗口