2017-07-17 13 views
0

私のプログラムでは、必要なリソースの一部がデータを格納するディレクトリです。習慣通り、私はこのディレクトリを~/.program/にすることにしました。 C++では、(UNIXベースのシステム上で)このディレクトリを作成するための正しい方法は、このコードされています。今、mkdir("~/.program/", S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH)~を使用しての信頼性は、私が実際に何をしたいので、少なくとも疑問である文字列内の変数を使用する

#include <sys/stat.h> 
#include <unistd.h> 
#include <iostream> 

using namespace std; 

void mkworkdir() 
{ 
    if(stat("~/.program",&st) == 0) 
    { 
     cout << "Creating working directory..." << endl; 
     mkdir("~/.program/", S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); 
     mkdir("~/.program/moredata", S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); 
    } 

    else 
    { 
     cout << "Working directory found... continuing" << endl; 
    } 
} 

int main() 
{ 
    mkworkdir(); 
    return 0; 
} 

doはstringstring usern; cin >> usern;のような)に保存してからmkdir("/home/{$USERN}/.program/", S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH)(シェルのように)を実行します。しかし、私は文字列に$ USERNをいくつか等価にする方法がわかりません。文字列に拡張可能なC++構造を得る方法はわかりません。私が意味することは、変数の "フォーム"をその変数の内容に展開して文字列に挿入することです。

この質問が混乱している場合はお詫び申し上げますが、私は欲しいものが何であるかを正確に説明することはできないようだ。

また、ユーザー名を要求せずにユーザー名を取得することは可能ですか?

答えて

4

あなたが使用することができます(もちろん、文字列でこれを保存):

std::string usern; 
std::cin >> usern; 
std::string directory = "/home/" + usern + "/.program"; 
mkdir(directory.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); 

より良い代替手段は、IMO、環境変数HOMEの値を使用することです。

char const* home = std::getenv("HOME"); 
if (home == nullptr) 
{ 
    // Deal with problem. 
} 
else 
{ 
    std::string directory = home + std::string("/.program"); 
    mkdir(directory.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); 
} 

FWIW、あなたはなど、右のフラグを使用して、あなたはディレクトリが存在するかどうかを確認するの詳細を追加することができ、アプリケーションの名前空間に機能make_directoryを作成して、コードを簡素化することができ

namespace MyApp 
{ 
    bool directory_exists(std::string const& directory) 
    { 
     struct stat st; 

     // This is simplistic check. It will be a problem 
     // if the entry exists but is not a directory. Further 
     // refinement is needed to deal with that case. 
     return (stat(directory.c_tr(), &st) == 0);  
    } 

    int make_directory(std::string const& directory) 
    { 
     if (directory_exists(directory)) 
     { 
     return 0; 
     } 
     return mkdir(directory.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); 
    } 
} 

とし、残りのコードではMyApp::make_directoryとすることができます。 usernでユーザ名を持つ

char const* home = std::getenv("HOME"); 
if (home == nullptr) 
{ 
    // Deal with problem. 
} 
else 
{ 
    std::string directory = home + std::string("/.program"); 
    MyApp::make_directory(directory); 
    MyApp::make_directory(directory + "/moredata"); 
} 
1

、あなたは文字列あなたが好きなよう構築することができます。ユーザーをpromtingせずにユーザ名を取得するには

std::string dir = "/home/" + usern + "/.program/" 

mkdir(dir.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); 
mkdir(dir.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); 

を唯一の私ができる場合は、getlogin_r()

+0

を使用することができます回答として2つの応答をマークしてください:( –

+0

@DistantGraphics Sahuの答えははるかに良いので、心配はありません。乾杯! – Ramon

関連する問題