Cプログラムで現在のディレクトリを取得する方法は?


162

プログラムを開始するディレクトリを取得する必要があるCプログラムを作成しています。このプログラムはUNIXコンピュータ用に書かれています。私はopendir()and を見てきましたがtelldir()、をtelldir()返すoff_t (long int)ので、それは本当に私を助けません。

文字列(char配列)の現在のパスを取得するにはどうすればよいですか?

回答:


291

あなたは見ましたgetcwd()か?

#include <unistd.h>
char *getcwd(char *buf, size_t size);

簡単な例:

#include <unistd.h>
#include <stdio.h>
#include <limits.h>

int main() {
   char cwd[PATH_MAX];
   if (getcwd(cwd, sizeof(cwd)) != NULL) {
       printf("Current working dir: %s\n", cwd);
   } else {
       perror("getcwd() error");
       return 1;
   }
   return 0;
}

11
最も厳格なnitを選択すると、<errno.h>は不要に見え、プログラムは、終了ステータスを介して、失敗した場合でも成功を報告します。そうでなければ、良い例です。
ジョナサンレフラー、

21
ああ、そしてfprintf(stdout、...)の代わりにprintf(...)を使用するのがより一般的ですか?
ジョナサンレフラー、

19
@JonathanLeffler:それは一匹狼のうるさいものではありません。これは:であるint main()必要がありますint main(void)
キーストンプソン

4
スタックの〜4KBが問題でない場合、マジックナンバーの代わりに、limits.hのPATH_MAXを使用します。
jacekmigacz 2017年

1
それでもそこにはないので、バッファは文字列終了バイト/ヌルにも対応する必要があるため、正しいものはchar cwd[PATH_MAX+1]です。または、バッファに煩わされずchar *buf=getcwd(NULL,0);、完了したときにfree(buf)(POSIX.1-2001現在)
bliako

60

のマニュアルページを調べてくださいgetcwd


7
@angadは男に釣りを教えるが、少なくとも彼に湖/海/海への道を示す:)
mtk

3
非常に優れた検索方法であるグーグルを使用しようとしている人に男性を勧めている人は連絡が取れません。
gbtimmon 2016

3
コードスニペット:man 3 getcwd。冗談はさておき、このページは'08からのものです。SOの慣例は異なりました。
Kroltan 2016年

2
@gbtimmon googleは検索エンジンであり、manページに類似していません。最終的にはmanページを指すようになります。
Ajay Brahmakshatriya 2017

24

質問はUnixとタグ付けされていますが、ターゲットプラットフォームがWindowsの場合にも人々はそれにアクセスできます。Windowsの答えはGetCurrentDirectory()関数です。

DWORD WINAPI GetCurrentDirectory(
  _In_  DWORD  nBufferLength,
  _Out_ LPTSTR lpBuffer
);

これらの回答は、CコードとC ++コードの両方に適用されます。

別の質問へのコメントでuser4581301によって提案され、Google検索「site:microsoft.com getcurrentdirectory」で現在の最上位の選択肢として確認されたリンク。


2
#include <stdio.h>  /* defines FILENAME_MAX */
//#define WINDOWS  /* uncomment this line to use it for windows.*/
#ifdef WINDOWS
#include <direct.h>
#define GetCurrentDir _getcwd
#else
#include <unistd.h>
#define GetCurrentDir getcwd
#endif

int main(){
  char buff[FILENAME_MAX];
  GetCurrentDir( buff, FILENAME_MAX );
  printf("Current working dir: %s\n", buff);
  return 1;
}

3
#if defined(_WIN32)||のようなOSを検出するためにpre_definedマクロを使用しないのはなぜですか?定義済み(_WIN64)|| defined(WINDOWS
HaseeB Mir 2018

1

getcwd(3)Microsoftのlibc:getcwd(3)でも利用可能であり、期待どおりに動作することに注意してください。

-loldnames(oldnames.lib、ほとんどの場合自動的に実行される)とリンクするか、を使用する必要があります_getcwd()。接頭辞なしのバージョンは、Windows RTでは使用できません。


0

現在のディレクトリ(ターゲットプログラムを実行する場所)を取得するには、Visual StudioとLinux / MacOS(gcc / clang)の両方(CとC ++の両方)で機能する次のサンプルコードを使用できます。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#if defined(_MSC_VER)
#include <direct.h>
#define getcwd _getcwd
#elif defined(__GNUC__)
#include <unistd.h>
#endif

int main() {
    char* buffer;

    if( (buffer=getcwd(NULL, 0)) == NULL) {
        perror("failed to get current directory\n");
    } else {
        printf("%s \nLength: %zu\n", buffer, strlen(buffer));
        free(buffer);
    }

    return 0;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.