2010-07-09 21 views
17

में लिनक्स या विंडोज़ सी ++ में एक क्रॉस-प्लेटफ़ॉर्म संगत फ़ंक्शन लिख रहा है जो इनपुट फ़ाइल नामों के आधार पर निर्देशिका बनाता है। मुझे यह जानने की ज़रूरत है कि मशीन लिनक्स या खिड़कियां है या उचित आगे या पीछे स्लैश का उपयोग करें। नीचे दिए गए कोड के लिए, यदि मशीन लिनक्स है तो isLinux = true। मैं ओएस कैसे निर्धारित करूं?निर्धारित करें कि क्या सी ++

bool isLinux; 
std::string slash; 
std::string directoryName; 

if isLinux 
    slash = "/"; 
else 
    slash = "\\"; 
end 

boost::filesystem::create_directory (full_path.native_directory_string() + slash + directoryName); 
+7

यदि आप उपयोगकर्ता के लिए पथ नहीं दिखा रहे हैं, तो आप इसे सरल रख सकते हैं और केवल आगे फॉरवर्ड स्लैश का उपयोग कर सकते हैं। विंडोज दोनों समझता है। (यदि आप इसे दिखाने पर योजना बनाते हैं, तो आपको शायद विंडोज़ पर बैकस्लाश का उपयोग करना चाहिए - यह ओएस के साथ संगत होने के लिए अच्छा लगता है।) –

उत्तर

32

उपयोग:

#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) 
static const std::string slash="\\"; 
#else 
static const std::string slash="/"; 
#endif 

Btw, आप अभी भी सुरक्षित रूप से इस स्लैश "/" विंडोज पर खिड़कियों के रूप में उपयोग कर सकते हैं इस पूरी तरह से समझता है। तो बस "/" स्लैश के साथ चिपकने से ओपनवीएमएस की तरह सभी ओएस के लिए समस्याएं हल हो जाएंगी, जहां पथ foo:[bar.bee]test.ext को /foo/bar/bee/test.ext के रूप में दर्शाया जा सकता है।

+5

कुछ Win32 फ़ंक्शंस हैं जो गलत Win32 निर्देशिका विभाजक वर्ण "/" पसंद नहीं करते हैं। लेकिन अगर आप Win32 फ़ंक्शंस का उपयोग करते हैं, तो आप शायद पहले से ही जानते हैं कि आप विंडोज को लक्षित कर रहे हैं। –

+0

@Andreas, जो Win32 कार्यों को "/" के साथ परेशानी है? – Tomas

+4

"कुछ" से मेरा मतलब वास्तव में "कुछ" है ... :) मुझे लगता है कि इनमें से कुछ संवेदनशील हैं: http://msdn.microsoft.com/en-us/library/bb773559(VS.85).aspx इन इसके अलावा, यहां एक स्पष्ट चेतावनी है: http://msdn.microsoft.com/en-us/library/ms684175(VS.85).aspx। फिर भी, मेरे पास आगे की स्लैश के खिलाफ मुख्य बात यह है कि जब मैं माइक्रोसॉफ्ट विंडोज पथ में से किसी एक को देखता हूं तो यह मेरी आंखों में दर्द होता है ... –

13

आम तौर पर, आप सशर्त संकलन के साथ ऐसा करते हैं।

यह कहा गया है कि, यदि आप boost::filesystem का उपयोग कर रहे हैं तो आपको portable generic path format का उपयोग करना चाहिए ताकि आप इस तरह की चीजों को भूल सकें।

+0

मुझे यकीन नहीं है कि मैं उदाहरण को समझता हूं कि " ओपनवीएमएस:" SYS1 :: डिस्क 1: [जेएनई.YLER.HARRY] "को एक फ़ाइल नाम के साथ पोर्टेबल पथनाम के बजाय सिस्टम नाम, ड्राइव नाम और तीन निर्देशिका फ़ाइल नामों के साथ मूल पथनाम के रूप में माना जाता है। - विंडोज़:" सी: \\ जेन \\ टायलर \\ हैरी "को एक फ़ाइल नाम के साथ एक पोर्टेबल पथनाम के बजाय एक ड्राइव अक्षर, रूट-निर्देशिका, और तीन फ़ाइल नामों के साथ मूल पथनाम के रूप में माना जाता है। अगर full_path.native_directory_string() = c: \\ खिलौने और मैं फ़ोल्डर "ब्लॉक" बनाना चाहता हूं तो पोर्टेबल जेनेरिक पथ प्रारूप का उपयोग करके मैं इसे कैसे लिखूं? – Elpezmuerto

+0

@Elpez: आप 'native_directory_string' का उपयोग नहीं कर सकते ... यह सही प्रारूप में आउटपुट नहीं जा रहा है। मैं कह सकता हूं कि आपका अंतिम निर्देशिका पथ सी:/खिलौने/ब्लॉक जैसा कुछ होना चाहिए। –

0

ऐसा करने के लिए सबसे अधिक उपयोग किए जाने वाले तरीकों में से एक pre-processor directive है। लिंक सी के लिए है लेकिन सी ++ में उनका उपयोग उसी तरह किया जाता है। उचित चेतावनी, प्रत्येक कंपाइलर & ओएस के अपने निर्देशों का सेट हो सकता है।

1

http://en.wikipedia.org/wiki/Uname

में देखो तुम जी ++ उपयोग कर रहे हैं अपने संकलक/जीएनयू के रूप में तो आप नीचे दिए गए कोड की कोशिश कर सकते।

#include <stdio.h> 
#include <sys/utsname.h> 
#include <stdlib.h> 

int main() 
{ 
    struct utsname sysinfo; 
    if(uname(&sysinfo)) exit(9); 
    printf("os name: %s\n", sysinfo.sysname); 
    return 0; 
} 
+6

विंडोज़ में

+0

@ बिली कृपया डाउनवोट से पहले http://en.wikipedia.org/wiki/Uname पढ़ें। मैंने जी ++ का उल्लेख किया, और जीएनयू इसका समर्थन करता है। मैंने g ++/CYGWIN पर कोड संकलित किया है। – Fanatic23

+0

@ बिली ओनेल - मिनीजीडब्ल्यू या साइगविन का उपयोग करते समय, विंडोज़ इसका अधिकार रख सकता है। – doc

4

डिफ़ॉल्ट रूप से, दृश्य स्टूडियो #define रों _WIN32 पूर्वप्रक्रमक परियोजना सेटिंग्स में: POSIX अनुरूप वातावरण इस समर्थन करते हैं।

तो आप उपयोग कर सकते

// _WIN32 = we're in windows 
#ifdef _WIN32 
// Windows 
#else 
// Not windows 
#endif 
0

predef.sourceforge.net कि compilers/ऑपरेटिंग सिस्टम और अधिक पहचान मैक्रो के सभी प्रकार के लिए एक व्यापक संग्रह है। (सीधे ऑपरेटिंग सिस्टम उप-साइट से लिंक करना)

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