C प्रोग्राम में करंट डायरेक्टरी कैसे प्राप्त करें?


162

मैं एक सी प्रोग्राम बना रहा हूं, जहां मुझे उस निर्देशिका को प्राप्त करने की आवश्यकता है जिसे प्रोग्राम से शुरू किया गया है। यह कार्यक्रम UNIX कंप्यूटरों के लिए लिखा गया है। मैं देख रहा हूँ opendir()और telldir(), लेकिन telldir()एक लौटाता है off_t (long int), तो यह वास्तव में मेरी मदद नहीं करता है।

मैं एक स्ट्रिंग (चार सरणी) में वर्तमान पथ कैसे प्राप्त कर सकता हूं?

जवाबों:


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
Nits के pickiest को उठाते हुए, <ढ्डह्म> अनावश्यक लगता है, और कार्यक्रम अपने निकास की स्थिति के माध्यम से विफलता पर भी सफलता की रिपोर्ट करता है। अन्यथा, एक अच्छा उदाहरण है।
जोनाथन लेफलर

21
ओह, और क्या यह फ़ुटप्रिंट (स्टडआउट, ...) के स्थान पर प्रिंटफ़ (...) का उपयोग करना अधिक पारंपरिक है?
जोनाथन लेफलर

19
@JonathanLeffler: यह सबसे छोटा नहीं है। यह है: int main()होना चाहिए int main(void)
कीथ थॉम्पसन

4
मैं PATH_MAX को सीमाओं से उपयोग करूँगा। यदि मैजिक नंबर के बजाय ~ 4KB स्टैक कोई समस्या नहीं है।
jacekmigacz

1
अभी भी वहाँ नहीं है, आपके बफर को स्ट्रिंग-समाप्ति बाइट / अशक्त के लिए भी समायोजित करना चाहिए, इसलिए सही एक है char cwd[PATH_MAX+1]। या अगर आप बफ़र्स से परेशान नहीं हो सकते हैं char *buf=getcwd(NULL,0);और जब आप free(buf)(POSIX.1-2001 के अनुसार) कर रहे हैं
bliako

60

के लिए मैन पेज देखें getcwd


7
@ अंगद एक आदमी को मछली सिखाते हैं, लेकिन कम से कम उसे झील / समुद्र / समुद्र का रास्ता दिखाते हैं :)
mtk

3
लोग बहुत बेहतर खोज विधि का उपयोग करने की कोशिश कर रहे लोगों को आदमी की सिफारिश कर रहे हैं जो Google संपर्क से बाहर हैं।
gbtimmon

3
कोड स्निपेट man 3 getcwd:। एक तरफ चुटकुले, अराजकतावादी मत बनो, यह पोस्ट '08 से है, एसओ कन्वेंशन अलग थे।
क्रोल्टन

2
@gbtimmon google एक सर्च इंजन है, यह मैन पेज के अनुरूप नहीं है। यह अंततः मैन पेज की ओर इशारा करने वाला है।
अजय ब्रह्मक्षत्रिय

24

हालाँकि यह सवाल यूनिक्स को टैग किया गया है, लेकिन लोगों को यह तब भी देखने को मिलता है जब उनका टारगेट प्लेटफॉर्म विंडोज होता है, और विंडोज के लिए जवाब GetCurrentDirectory()फंक्शन होता है:

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

ये उत्तर C और C ++ कोड दोनों पर लागू होते हैं।

लिंक को किसी अन्य प्रश्न के लिए एक टिप्पणी में user4581301 द्वारा सुझाया गया है , और एक Google खोज 'साइट: 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 परिभाषित (_WIN32) || परिभाषित (_WIN64) || परिभाषित ( विन्डोज़ )
हसीबी मीर

1

ध्यान दें कि getcwd(3)Microsoft के libc में भी उपलब्ध है: getcwd (3) , और उसी तरह काम करता है जिस तरह से आप अपेक्षा करते हैं।

-loldnames(Oldnames.lib, जो कि ज्यादातर मामलों में स्वचालित रूप से किया जाता है), या उपयोग के साथ लिंक करना चाहिए _getcwd()। विंडोज आरटी के तहत उपसर्ग संस्करण अनुपलब्ध है।


0

वर्तमान निर्देशिका प्राप्त करने के लिए (जहां आप अपने लक्ष्य कार्यक्रम को निष्पादित करते हैं), आप निम्न उदाहरण कोड का उपयोग कर सकते हैं, जो विजुअल स्टूडियो और लिनक्स / मैकओएस (जीसीसी / क्लैंग) दोनों के लिए काम करता है, दोनों सी और सी ++:

#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;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.