2010-02-26 16 views
12

लिनक्स में प्रोग्रामेटिक रूप से दिए गए सापेक्ष पथ के लिए पूर्ण पथ कैसे प्राप्त करें?लिनक्स में प्रोग्रामेटिक रूप से दिए गए सापेक्ष पथ के लिए पूर्ण पथ कैसे प्राप्त करें?

विंडोज़ की वजह से हमारे पास _fullpath() API है। दूसरे शब्दों में, मेरा मतलब है कि लिनक्स में विंडोज के _fullpath के अनुरूप एपीआई क्या है?

+0

इस के बाद से में realpath 'c' के साथ टैग किया गया है, यह शायद http://stackoverflow.com/questions/229012/getting-absolute- का डुप्लिकेट है पथ-ऑफ-ए-फाइल – bfontaine

उत्तर

14

पॉल के रूप में उल्लेख किया है, realpath() का उपयोग करें। कृपया ध्यान दें, हालांकि, लिनक्स में कई फ़ाइल सिस्टम hard links का समर्थन करते हैं, इसलिए किसी दिए गए निर्देशिका में कई अलग-अलग पथ हो सकते हैं।

+0

किसी दिए गए फ़ाइल, निश्चित रूप से कर सकते हैं। निर्देशिकाओं के लिए हार्ड-लिंक जरूरी नहीं है। Symlinks भी कुछ भ्रम पैदा करता है जब यह "वास्तविक" पथ निर्धारित करने के लिए आते हैं। – Vatine

+0

@unwind, जानकारी के लिए धन्यवाद। यदि हार्ड लिंक के कारण, यदि कोई दी गई निर्देशिका कई अलग-अलग पूर्ण पथों का समाधान करती है, तो realpath API का व्यवहार क्या होगा? – Jay

+4

निर्देशिकाओं के लिए हार्डलिंक्स को अधिकांश फाइल सिस्टम द्वारा बुराई और वर्जित माना जाता है। –

6

realpath का प्रयास करें:

$ man realpath 

यह भी बीएसडी, ओएस एक्स, एट अल में उपलब्ध है।

3

है realpathstdlib.h से

+2

मैंने तुरंत रीयलपाथ के बारे में सोचा, लेकिन मैं * डर गया * * * डर गया * मैं कहता हूं - जब मैंने आपका जवाब दिखाया कि 'असलीपथ' 'stdlib.h' में है। निश्चित रूप से * * सत्य नहीं हो सकता है, क्योंकि 'असलीपाथ' सी पुस्तकालय का हिस्सा नहीं है। लो और देखो, यह सच है। मैं डंबफॉल्ड हूँ। एक अच्छी तरह से गठित कार्यक्रम क्या है जो 'असलीपथ' नामक अपने स्वयं के कार्य को परिभाषित करता है? उन पॉज़िक्स लोगों ने अमोक चलाया है! * आमोक * मैं कहता हूं! –

+0

दान: जब तक वे "कड़ाई से अनुरूप" मोड में अपने कंपाइलर का आह्वान करते हैं और अनिश्चित व्यवहार (जैसे '_XOPEN_SOURCE') का आह्वान करने वाले किसी भी मैक्रोज़ को परिभाषित नहीं करते हैं, तो वे ठीक होना चाहिए। – caf

13

realpath फ़ंक्शन देखें।

#include <stdlib.h> 
#include <stdio.h> 
#include <linux/limits.h> 
int main() 
{ 
     char resolved_path[PATH_MAX]; 
     realpath("../../", resolved_path); 
     printf("\n%s\n",resolved_path); 
     return 0; 
} 
+0

कृपया 100 – Speed8ump

+2

के बजाय PATH_MAX का उपयोग करें यह कोड असुरक्षित और छोटी गाड़ी है, जैसा ऊपर बताया गया है। ** ** ** असली रफ़र को इतना छोटा बफर दें जो सबसे अधिक संभावना बफर आकार से परे लिखता है (क्योंकि * * को * PATH_MAX की लंबाई * की आवश्यकता होती है)। यहां तक ​​कि यदि प्रोग्राम क्रैश नहीं होता है, तो यह कोड वैरिएबल लेआउट के आधार पर सुरक्षा भेद्यता का कारण बन सकता है, यदि कोई विरोधी हल करने के लिए मूल पथ को नियंत्रित कर सकता है। मैनुअल ने एक दूसरे पैरामीटर के रूप में एनयूएलएल को पास करने की सिफारिश की है और POSIX_MAX परिभाषाओं के साथ कोई समस्या सुनिश्चित करने के लिए 'realpath' स्मृति को आवंटित करने की अनुशंसा की है। –

+0

मुझे लगता है कि यह हमेशा याद रखना अच्छा लगता है कि PATH_MAX बस नहीं है: http://insanecoding.blogspot.com.br/2007/11/pathmax-simply-isnt.html –

0

भी एक और उपयोगी तरीका है, जैसे "readlink मी $ फ़ाइल नाम"

सबसे पहले, यह लक्ष्य फ़ाइल का अस्तित्व के लिए आवश्यकता के बिना काम करता है। दूसरा, यह सिम्लिंक को संभालेगा और वास्तव में वास्तविक पथ प्राप्त करेगा।

1

रेडहाट 5.3 पर चल रहा है, रीयलपाथ मौजूद नहीं है लेकिन रीडलिंक स्थापित है। आप इसे सापेक्ष पथ और सिम्लिंक पर उपयोग कर सकते हैं, साथ ही यह आपके लिए सिम्लिंक को लगातार हल करेगा। यह इस प्रकार एक बेहतर विकल्प है कि मेरी राय

 
readlink -f . 
-1
// For C++ with Gnome Gtkmm3 libraries 
#include <glibmm.h> 
#include <giomm.h> 

    string PathRel2Abs(string relpath) { 
    Glib::RefPtr<Gio::File> file = Gio::File::create_for_path(relpath); 
    return file->get_path(); 
} 
+1

आमतौर पर कोड कैसे काम करता है इस पर आपकी पोस्ट में कुछ स्पष्टीकरण जोड़ना एक अच्छा विचार है। यह नए डेवलपर्स को यह जानने में मदद करता है कि कोड क्या करता है। –

+0

और यह सी भी नहीं है। –

संबंधित मुद्दे