4

私は模擬シェルプログラムを設計していますが、「cd」コマンドを完全に模倣することはできません。chdir()を試しましたが、うまくいかなかったので、環境変数「PWD="」の変更に移りました。

これが私が持っているものです、そしてこれは近いかもしれないと思います。(私が間違っているか、chdir()に近かった場合は、訂正してください)

else if (command == "cd")
        {
            string pathEnv = "PWD=";
            string newDir;
            cin >> newDir;
            pathEnv+=newDir;
            cout << pathEnv << endl;
            putenv(pathEnv.c_str());
        }

うまくいけば、コマンドは'cd / user / username / folder'であり、私のpathEnv変数は "PWD = / user / username / folder"であり、ディレクトリを変更する可能性がありますか?

どんな洞察も大歓迎です。

4

2 に答える 2

7

chdir()は、探しているコマンドです。現在の作業ディレクトリを設定した後、 getcwd()を使用して現在の作業ディレクトリを取得しましたか?


これが私のために働いたコードです。

#include <iostream>
#include <string>
#include <sys/param.h>
#include <unistd.h>

...

if (command == "curr") {
    char buffer[MAXPATHLEN];
    char *path = getcwd(buffer, MAXPATHLEN);
    if (!path) {
        // TODO: handle error. use errno to determine problem
    } else {
        string CurrentPath;
        CurrentPath = path;
        cout << CurrentPath << endl;
    }
} else if (command == "cd") {
    string newDir;
    cin >> newDir;
    int rc = chdir(newDir.c_str());
    if (rc < 0) {
        // TODO: handle error. use errno to determine problem
    }
}

getcwd() には 3 つのバージョンがあります。

char *getcwd(char *buf, size_t size);
char *getwd(char *buf);
char *get_current_dir_name(void);

使用方法の詳細については、UNIX の man ページを参照してください。

于 2012-05-29T01:53:47.460 に答える
1

PWDの変更など、システムが行っていることを「モック」アップするのではなく、常にコードでシステムコールを使用する必要があります。優れた UNIX システムを使用chdirしている場合は、この呼び出しを使用する必要があります。Windows ボックスを使用している場合は、SetCurrentDirectory. 私は Windows 開発者ではありませんが、このリンクを見つけました。http://msdn.microsoft.com/en-us/library/windows/desktop/aa363806%28v=vs.85%29.aspx

于 2012-05-29T20:23:03.600 に答える