Geçerli dizini bir C programında nasıl edinebilirim?


163

Programın başlatıldığı dizini almam gereken bir C programı yapıyorum. Bu program UNIX bilgisayarları için yazılmıştır. Ben bakarak oldum opendir()ve telldir()ancak telldir()bir döner off_t (long int)gerçekten bana yardım etmez, bu yüzden.

Bir dizede (char dizisi) geçerli yolu nasıl alabilirim?

Yanıtlar:


292

Bir baktın mı getcwd()?

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

Basit örnek:

#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
En çok nit olanı seçerken, <errno.h> gereksiz görünüyor ve program çıkış durumu üzerinden başarısız olsa bile başarıyı rapor ediyor. Aksi takdirde güzel bir örnek.
Jonathan Leffler

21
Oh, ve fprintf (stdout, ...) yerine printf (...) kullanmak daha geleneksel mi?
Jonathan Leffler

19
@JonathanLeffler: Bu en heyecanlıların değil. Bu: int main()olmalı int main(void).
Keith Thompson

4
Yığında ~ 4KB bir sorun değilse, sihirli sayı yerine limit.h, PATH_MAX kullanırdım.
jacekmigacz

1
Hala orada değil, arabellek dizesi sonlandırma bayt / null için de uygun olmalıdır, bu nedenle doğru olanıdır char cwd[PATH_MAX+1]. Veya sadece arabelleklerden rahatsız olmuyorsanız ve işiniz char *buf=getcwd(NULL,0);bittiğinde free(buf)(POSIX.1-2001 itibariyle)
bliako

60

Adam sayfasına bakın getcwd.


7
@angad balık adam öğretmek ama en azından göle / deniz / okyanus yolunu göstermek :)
mtk

3
google son derece üstün arama yöntemini kullanmaya çalışan kişilere adam tavsiye insanlar temas dışında.
gbtimmon

3
Kod pasajı: man 3 getcwd. Şakalar bir yana, anarkoşik olma, bu yazı '08'den, SO sözleşmeleri farklıydı.
Kroltan

2
@gbtimmon google bir arama motorudur, man sayfasına benzemez. Sonunda man sayfasını gösterecek.
Ajay Brahmakshatriya

24

Her ne kadar soru Unix olarak etiketlenmiş olsa da, insanlar hedef platformları Windows olduğunda da ziyarete gelirler ve Windows için cevap GetCurrentDirectory()işlevdir:

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

Bu yanıtlar hem C hem de C ++ kodu için geçerlidir.

Bağlantı önerdiği user4581301 bir de açıklama başka soruya ve Google arama 'site: microsoft.com GetCurrentDirectory' ile şimdiki en iyi seçenek olarak doğrulandı.


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
Neden #if tanımlı (_WIN32) gibi işletim sistemi algılamak için önceden tanımlanmış makrolar kullanmıyorsunuz || tanımlanmış (_WIN64) || tanımlandı ( WINDOWS )
HaseeB Mir

1

getcwd(3)Microsoft'un libc: getcwd (3) sürümünde de mevcut olduğunu ve beklediğiniz gibi çalıştığını unutmayın.

-loldnames(Çoğu durumda otomatik olarak yapılan oldnames.lib) ile bağlantı kurmalı veya kullanmalısınız _getcwd(). Önceden düzeltilmemiş sürüm Windows RT altında kullanılamaz.


0

Geçerli dizini (hedef programınızı yürüttüğünüz yer) almak için, hem Visual Studio hem de Linux / MacOS (gcc / clang), hem C hem de C ++ için çalışan aşağıdaki örnek kodu kullanabilirsiniz:

#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;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.