天天看點

linux下擷取程式所在目錄絕對路徑

【前言】

工作目錄與程式所在目錄的差別:

<code>~$ </code><code>ls</code> <code>-l </code><code>/proc/self/cwd</code>                                               

<code>lrwxrwxrwx 1 walker walker 0  7月 10 10:12 </code><code>/proc/self/cwd</code> <code>-&gt; </code><code>/home/walker</code>

<code>~$ </code><code>ls</code> <code>-l </code><code>/proc/self/exe</code> 

<code>lrwxrwxrwx 1 walker walker 0  7月 10 10:12 </code><code>/proc/self/exe</code> <code>-&gt; </code><code>/bin/ls</code>

上面示例中/home/walker為ls程式目前工作目錄,/bin/ls為ls程式實際所在目錄。

1、Shell版

<code>#擷取目前腳本所在絕對路徑,需在腳本檔案裡方能執行</code>

<code>cur_dir=$(</code><code>cd</code> <code>"$(dirname "</code><code>$0</code><code>")"</code><code>; </code><code>pwd</code><code>)</code>

2、C語言版

方法一:用realpath函數。這種方法用于開機啟動程式擷取自身目錄會出錯。

<code>#include &lt;stdio.h&gt;</code>

<code>#include &lt;string.h&gt;</code>

<code>#include &lt;stdlib.h&gt;</code>

<code>#include &lt;limits.h&gt;</code>

<code> </code> 

<code>#define MAX_SIZE (PATH_MAX+1)</code>

<code>  </code> 

<code>int</code> <code>main()</code>

<code>{</code>

<code>    </code><code>char</code> <code>current_absolute_path[MAX_SIZE];</code>

<code>    </code><code>//擷取目前目錄絕對路徑</code>

<code>    </code><code>if</code> <code>(NULL == realpath(</code><code>"./"</code><code>, current_absolute_path))</code>

<code>    </code><code>{</code>

<code>        </code><code>printf</code><code>(</code><code>"***Error***"</code><code>);</code>

<code>        </code><code>exit</code><code>(-1);</code>

<code>    </code><code>}</code>

<code>    </code><code>strcat</code><code>(current_absolute_path, </code><code>"/"</code><code>);</code>

<code>    </code><code>printf</code><code>(</code><code>"current absolute path:%s\n"</code><code>, current_absolute_path);</code>

<code>     </code> 

<code>    </code><code>exit</code><code>(0);</code>

<code>}</code>

方法二:用getcwd函數。這種方法用于開機啟動程式擷取自身目錄會出錯。

<code>char</code> <code>current_absolute_path[MAX_SIZE];</code>

<code>//擷取目前目錄絕對路徑</code>

<code>if</code> <code>(NULL == getcwd(current_absolute_path, MAX_SIZE))</code>

<code>    </code><code>printf</code><code>(</code><code>"***Error***\n"</code><code>);</code>

<code>    </code><code>exit</code><code>(-1);</code>

<code>printf</code><code>(</code><code>"current absolute path:%s\n"</code><code>, current_absolute_path);</code>

方法三:用readlink函數。這種方法最可靠,可用于開機啟動程式擷取自身目錄。

<code>//擷取目前程式絕對路徑</code>

<code>int</code> <code>cnt = readlink(</code><code>"/proc/self/exe"</code><code>, current_absolute_path, MAX_SIZE);</code>

<code>if</code> <code>(cnt &lt; 0 || cnt &gt;= MAX_SIZE)</code>

<code>//擷取目前目錄絕對路徑,即去掉程式名</code>

<code>int</code> <code>i;</code>

<code>for</code> <code>(i = cnt; i &gt;=0; --i)</code>

<code>    </code><code>if</code> <code>(current_absolute_path[i] == </code><code>'/'</code><code>)</code>

<code>        </code><code>current_absolute_path[i+1] = </code><code>'\0'</code><code>;</code>

<code>        </code><code>break</code><code>;</code>

本文轉自walker snapshot部落格51CTO部落格,原文連結http://blog.51cto.com/walkerqt/1029395如需轉載請自行聯系原作者

RQSLT

繼續閱讀