Bagaimana cara mendapatkan direktori saat ini dalam program C?

162

Saya membuat program C di mana saya harus mendapatkan direktori tempat program dimulai. Program ini ditulis untuk komputer UNIX. Saya telah melihat opendir()dan telldir(), tetapi telldir()mengembalikan off_t (long int), jadi itu benar-benar tidak membantu saya.

Bagaimana saya bisa mendapatkan jalur saat ini dalam string (array char)?

CharlesB
sumber

Jawaban:

291

Apakah Anda sudah melihatnya getcwd()?

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

Contoh sederhana:

#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;
}
Mik
sumber
11
Memilih nits terpilih, <errno.h> tampaknya tidak perlu, dan program melaporkan keberhasilan bahkan pada kegagalan melalui status keluarnya. Kalau tidak, contoh yang bagus.
Jonathan Leffler
21
Oh, dan apakah lebih konvensional menggunakan printf (...) sebagai ganti fprintf (stdout, ...)?
Jonathan Leffler
19
@ JonathanLeffler: Itu bukan yang paling dipilih nits. Ini: int main()seharusnya int main(void).
Keith Thompson
4
Saya akan menggunakan PATH_MAX dari limit.h, alih-alih angka ajaib jika ~ 4KB di stack tidak menjadi masalah.
jacekmigacz
1
Masih tidak ada, buffer Anda juga harus mengakomodasi byte-null string-termination, oleh karena itu yang benar adalah char cwd[PATH_MAX+1]. Atau jika Anda tidak dapat diganggu dengan buffer secara adil char *buf=getcwd(NULL,0);dan ketika Anda selesai free(buf)(pada POSIX.1-2001)
bliako
60

Cari halaman manual untuk getcwd.

Pembuat Iklan
sumber
7
@angad mengajar seorang pria untuk memancing tetapi setidaknya menunjukkan kepadanya jalan ke danau / laut / laut :)
mtk
3
orang merekomendasikan pria kepada orang-orang yang mencoba menggunakan metode pencarian yang jauh lebih unggul dari Google.
gbtimmon
3
Kode potongan: man 3 getcwd. Selain lelucon, jangan anarkonistik, posting ini dari '08, konvensi SO berbeda.
Kroltan
2
@gbtimmon google adalah mesin pencari, itu tidak analog dengan halaman manual. Ini akhirnya akan menunjuk ke halaman manual.
Ajay Brahmakshatriya
24

Meskipun pertanyaannya ditandai Unix, orang juga bisa mengunjunginya ketika platform target mereka adalah Windows, dan jawaban untuk Windows adalah GetCurrentDirectory()fungsinya:

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

Jawaban ini berlaku untuk kode C dan C ++.

Tautan yang disarankan oleh pengguna4581301 dalam komentar ke pertanyaan lain, dan diverifikasi sebagai pilihan teratas saat ini dengan pencarian Google 'situs: microsoft.com getcurrentdirectory'.

Jonathan Leffler
sumber
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;
}
Jevgenij Kononov
sumber
3
Mengapa Anda tidak menggunakan macro yang telah ditentukan sebelumnya untuk mendeteksi OS seperti #jika didefinisikan (_WIN32) || didefinisikan (_WIN64) || didefinisikan ( WINDOWS )
HaseeB Mir
1

Catatan yang getcwd(3)juga tersedia di libc Microsoft: getcwd (3) , dan berfungsi seperti yang Anda harapkan.

Harus ditautkan dengan -loldnames(oldnames.lib, yang dilakukan secara otomatis di sebagian besar kasus), atau gunakan _getcwd(). Versi yang tidak diperbaiki tidak tersedia di bawah Windows RT.

rvx
sumber
0

Untuk mendapatkan direktori saat ini (di mana Anda menjalankan program target Anda), Anda dapat menggunakan kode contoh berikut, yang berfungsi untuk Visual Studio dan Linux / MacOS (gcc / dentang), baik C dan 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;
}
HaxtraZ
sumber