2009-04-10 9 views
4

ねえ、私はプログラム(一種の電子書籍閲覧型のもの)を書いていて、実行可能ファイルが置かれているフォルダ内のフォルダからテキストファイルを読み込みます。例えば、 "./folder/folder/program"というコマンドで別のディレクトリからプログラムを実行すると、作業ディレクトリが正しくないので、私のプログラムはテキストを見つけられないので、これは私には少し問題があります。私はプログラムを移植したいので、絶対的なディレクトリを持つことはできません。実行可能ファイルが実行されている正確なディレクトリを、別のディレクトリから実行しても取得する方法はありますか?私はargc [0]とgetcwd()を組み合わせることができると聞いたことがありますが、ディレクトリに空白があるとargcが切り捨てられます(可能でしょうか?)。Linux上で実行中のプログラムのディレクトリ?

私は事前

+1

argcは引数の数です。 argvは引数ベクトル(文字列へのポインタの配列)です。 argv [0]はスペースで切り捨てられません。 argv [0]は、プログラムを起動するプログラムによって選択され、必ずしもプログラムのパスとの関係はありません。 argv [0]が '/'を開始する場合は、getcwd()を追加しないでください。 –

+0

あなたはブーストライブラリにアクセスできますか? –

+0

秒待ってください。 「実行可能パス」または「実行ファイルが実行されているディレクトリ」が必要ですか? –

答えて

8

EDIT - getcwd()を使用しないでください。ユーザーが実行可能ファイルが存在しない場所です。

here for detailsを参照してください。

オンlinux/proc/<pid>/exeまたは/ proc/self/exeは、実行可能ファイルへのシンボリックリンクにする必要があります。他の人たちと同じように、もっと重要な質問は「なぜこれが必要なの?」と思う。補助ファイルを見つけるために実行可能なパスを使用するのは、実際はUNIX形式ではありません。代わりに、環境変数またはデフォルトの場所を使用するか、補助ファイルの場所を見つけるための他の規則の1つに従います(つまり、〜/。<myapp> rc)。

+0

"これは本当にUNIX形式ではありません..."どの形式ですか?私はそれが本当にANY_OS_FORMではないと思った。 –

+0

plinthは、ユーザ/システム用の設定ファイル/ディレクトリを追加し、完全なパスを検索することを推奨しています。たとえば、グローバル設定ファイルは/ etcにあり、ユーザ設定ファイルは通常〜/にあります。ファイルの場合は rc、〜/。 ディレクトリ。 –

+0

Mykola - それは1980年代のMacintosh/Windowsフォームです。私のアプリは1つのフォルダにあり、そのサポートファイルはそのフォルダに関連しています。サポートファイルを見つけるために、まずアプリケーションがどこにあるかを見つけます。 – plinth

0

にあなたはコマンドラインを読み取ることによって、実行中のプログラムのパスを取得することができたG ++、ありがとうを使用してLinux上です。 linuxでは/ proc/proc/PID/CommandLineフォルダを読んでコマンドラインを取得できます

2

ライブラリにブックを追加すると、その絶対パスを覚えておくことができます。
あなたのプログラムが、それが作業ディレクトリから起動され、他のディレクトリから起動されないという事実に依存しているのは、悪いことではありません。そのため、「作業ディレクトリ」パラメータを持つあらゆる種類の「リンク」が存在します。

あなたはそのような状況を望むように処理する必要はありません。必要なファイルとディレクトリの構造がすべて整っているかどうかを確認し、そうでない場合はエラーをログに記録してください。

または、プログラムが開始され、必要なファイルが見つからないときはいつでも、プログラムは本ライブラリへのパスを指示するように求めることができます。

あなたの現在のディレクトリ名を知る理由はまだ分かりません。

#include <boost/filesystem/convenience.hpp> 

#include <iostream> 
#include <ostream> 

int main(int argc, char** argv) 
{ 
    boost::filesystem::path argvPath(argv[0]); 
    boost::filesystem::path executablePath(argvPath.parent_path()); 
    boost::filesystem::path runPath(boost::filesystem::initial_path()); 

    std::cout << executablePath << std::endl; 
    std::cout << runPath << std::endl; 
    return 0; 
} 
0

argv[0]スペースがある場合は切り捨てられません。ただし、PATH環境変数にリストされているディレクトリからプログラムが実行されるときには、プログラム名のみが表示され、パスは表示されません。

ここで何をしようとしているのかは、Unix/Linuxプログラムではうまくいかないものです。データファイルはプログラムファイルと同じディレクトリに格納されません。適切なセキュリティポリシーを適用することが困難なためです。

あなたが望むものを得るには、シェルスクリプトを使って実際のプログラムを起動するのが最も良い方法です。これは、FirefoxがLinuxシステムでどのように起動するかと非常によく似ています。シェルはスクリプトの名前を$0に置き、この変数は常にパスを持ちます。

dir=`dirname "$0"` 
cd "$dir/../data/" 
"$dir/real-program" 

そして、それはファイルは次のようにややありますように、私はあなたのプログラムを手配します:次に、あなたはこのように、あなたのプログラムのデータファイルの場所を与えるために、環境変数やコマンドライン引数を使用することができます

install-dir/bin/program 
install-dir/bin/real-program 
install-dir/etc/config 
install-dir/data/book-file.mobi 
関連する問題