2012-10-22 14 views
8

संभव डुप्लिकेट:
Getting path relative to the current working directory?के सापेक्ष पथ सी # निरपेक्ष पथ परिवर्तित

मैं सी # में कोड है कि एक रिश्तेदार के लिए एक निरपेक्ष पथ से कुछ छवियों को शामिल है, ताकि छवि पाया जा सकता है है कोई फर्क नहीं पड़ता कि एप्लिकेशन गुना कहाँ स्थित है।

उदाहरण के लिए मेरी कोड में पथ (और छवि के लिए अपने लैपटॉप में)

C:/something/res/images/image1.jpeg 

है और मैं अपने कोड में पथ चाहते

..../images/image1.jpeg 

होने के लिए तो यह जहाँ भी चला सकते हैं फ़ोल्डर रखा गया है, जो भी C: विभाजन का नाम इत्यादि है

मैं अपने कोड में एक पथ रखना चाहता हूं जो एप्लिकेशन फ़ोल्डर स्थान से स्वतंत्र है या यदि यह दूसरे में है विभाजन, जब तक यह शेष समाधान के समान फ़ोल्डर में है।

मैं इस कोड है:

try 
{ 
    File.Delete("C:/JPD/SCRAT/Desktop/Project/Resources/images/image1.jpeg"); 
} 
catch (Exception) 
{ 
     MessageBox.Show("File not found:C:/Users/JPD/Desktop/Project/images/image1.jpeg"); 
    } 

इस कोड को केवल चलाता है, तो फ़ाइल और फ़ोल्डर, कि कुछ रास्ते में हैं मैं इतना रिश्तेदार होने के लिए उस पथ के लिए इच्छा (जो भी कोड का स्थान है) जहां भी मैं पूरा फ़ोल्डर (कोड, फाइल इत्यादि) डालता हूं, तब भी प्रोग्राम तब तक काम करेगा जब तक कोड (जो प्रोजेक्ट फ़ोल्डर के अंतर्गत है) फ़ोल्डर छवियों के साथ एक ही स्थान पर है ... मुझे क्या करना चाहिए?

+0

@ user1766548 यदि आप उस कोड को नहीं समझते हैं, तो आप यहां पोस्ट किए गए किसी अन्य कोड को कैसे समझेंगे? – Kiril

+0

इस परियोजना को एक ऐसे व्यक्ति द्वारा डुप्लिकेट के रूप में चिह्नित किया गया था जो उसके उत्तर के लिए डाउनवॉटेड हो गया था ... अच्छा –

+0

डुप्लिकेट में उत्तर एक अच्छा है। वहा जाओ। –

उत्तर

11

सापेक्ष पथ बाइनरी फ़ाइल से आधारित होते हैं, जिससे आपका एप्लिकेशन चल रहा है। डिफ़ॉल्ट रूप से, आपकी बाइनरी फ़ाइलों को [directory of your .csproj]/bin/डीबग में आउटपुट किया जाएगा। तो मान लीजिए कि आप अपने इमेज फ़ोल्डर को उसी स्तर पर बनाना चाहते हैं जैसे आपके .csproj। फिर आप सापेक्ष पथ "../../images/someImage.jpg" का उपयोग करके अपनी छवियों तक पहुंच सकते हैं।

इस के लिए एक बेहतर लग रहा है प्राप्त करने के लिए एक परीक्षण के रूप में निम्नलिखित की कोशिश:

1) एक नया दृश्य स्टूडियो नमूना परियोजना बनाने

2) बनाने के एक चित्र के रूप में एक ही स्तर पर फ़ोल्डर .csproj

3) डाल छवियों में कुछ फ़ाइलें फ़ोल्डर

4) अपने मुख्य विधि में इस नमूना कोड डाल -

static void Main(string[] args) 
    { 
     Console.WriteLine(Directory.GetCurrentDirectory()); 
     foreach (string s in Directory.EnumerateFiles("../../images/")) 
     { 
      Console.WriteLine(s); 
     } 
     Console.ReadLine(); // Just to keep the console from disappearing. 
    } 

आपको चरण (3) में रखी गई सभी फ़ाइलों के सापेक्ष पथ देखना चाहिए।

+0

मैं इसे आजमाउंगा और आपको परिणाम बता दूंगा, मैं वर्तमान में सो रहा हूं क्योंकि मैं असफल प्रयासों से बहुत थक गया हूं: डी –

+0

क्या आपका मतलब है कि आप उस निर्देशिका को बदलना चाहते हैं जहां आपका निष्पादन योग्य तैनात किया गया है? इसके अलावा, आप किस स्ट्रिंग मैनिपुलेशन से बचना चाहते हैं? – Blake

+0

कोई बात नहीं, मैंने आपके कोड का उपयोग किया, यह वास्तव में मदद की, मैंने अपने अनुवर्ती प्रश्नों का उत्तर दिया –

4

देखें: Getting path relative to the current working directory?

Uri uri1 = new Uri(@"c:\foo\bar\blop\blap"); 
Uri uri2 = new Uri(@"c:\foo\bar\"); 
string relativePath = uri2.MakeRelativeUri(uri1).ToString(); 
+1

में उत्तर है 'उरी uri2 = नई उरी (@ "सी: \ foo \ bar \ bazz") के लिए सही पथ नहीं देता है; ' –

+0

@ विजिजिटी यह एक सटीक डुप्लिकेट नहीं है कोई सवाल नहीं, मैं जो जवाब चाहता हूं वह ब्लेक का उत्तरदाता था। जिस जवाब का मैंने सोचा था, वह काम नहीं कर रहा था –

+1

@LB यदि बज़ एक निर्देशिका है, तो 'उरी uri2 = नया उरी (@ "c: \ foo \ bar \ bazz \") का उपयोग करें;' यदि बज़ एक फ़ाइल है तो यह सही है । –

1

अपने कार्यक्रम का सेट अप पर निर्भर करता है, तो आप बस पूरा पथ तार का एक हिस्सा लंघन द्वारा एक रिश्तेदार पथ का उपयोग करने में सक्षम हो सकता है। यह बेकार नहीं है, इसलिए जे स्किट इसके लिए मेरी चमकदार हो सकती है लेकिन मुझे लगता है कि आप इसे काम करना चाहते हैं। सौंदर्य बाद में चिंता का विषय है।

String absolutePath = @"c:\beep\boop\HereWeStart\hopp.gif"; 
String relativePath = absolutePath.Substring(13); 

फिर आप, अगर आप/इच्छा की जरूरत है, 13 नंबर (जो एक बदसूरत और अवांछनीय दृष्टिकोण है, अभी भी काम है, हालांकि) एक गतिशील के लिए आदान-प्रदान कर सकता है एक गणना की। उदाहरण के लिए (यह मानते हुए कि "HereWeStart" निर्देशिका, जहां आपका सापेक्ष पथ प्रारंभ हो रहा है, absolutePath में उस स्ट्रिंग की पहली घटना है) आप निम्नानुसार जा सकते हैं।

String absolutePath = @"c:\beep\boop\HereWeStart\hopp.gif"; 
int relativePathStartIndex = absolutePath.IndexOf("HereWeStart"); 
String relativePath = absolutePath.Substring(relativePathStartIndex); 

इसके अलावा, आपका प्रश्न एक अन्य प्रश्न पूछता है। मैं जानना चाहता हूं कि आप पूर्ण पथ कैसे प्राप्त कर रहे हैं। शायद एक साथ हलचल से बचने के लिए एक और अधिक चालाक तरीका है?

EDIT

आप निम्न दृष्टिकोण को भी आजमा सकते हैं। Directory कक्षा को भूल जाओ जो आपको एक पूर्ण पथ प्रदान करता है। सीधे सापेक्ष पथ के लिए जाओ। मुझे लगता है कि आप जिन फ़ाइलों को निकालने का प्रयास कर रहे हैं वे एक ही निर्देशिका में हैं। यदि नहीं, तो आपको कुछ और लाइनें जोड़ने की आवश्यकता होगी, लेकिन जब हम वहां पहुंच जाएंगे तो हम उस पुल को पार करेंगे।

उत्तर को हरे-चेक के रूप में चिह्नित करने के लिए मत भूलना (या जो अभी भी याद आ रही है या सुधार योग्य है)।

String 
    deletableTarget = @"\images\image1.jpeg", 
    hereWeAre = Environment.CurrentDirectory; 
MessageBox.Show("The taget path is:\n" + hereWeAre + deletableTarget); 

try 
{ File.Delete(hereWeAre + deletableTarget); } 
catch (Exception exception) 
{ MessageBox.Show(exception.Message); } 

इसके अलावा, कृपया ध्यान दें कि मैं अपने अपवाद हैंडलिंग को बदलने की स्वतंत्रता ले लिया। जबकि आपका काम कर रहा है, यह अंतर्निहित मैसेजिंग सिस्टम पर भरोसा करने के लिए एक बेहतर शैली है। इस तरह आप अधिक पेशेवर दिखने वाले त्रुटि संदेश प्राप्त करेंगे। ऐसा नहीं है कि हमें रन-टाइम पर कभी भी कोई त्रुटि मिलती है, है ना? ;)

+0

हां, मैं चाहता हूं कि यह काम करे। मैंने इस टिप्पणी को सी: /Users/JPD/Desktop/project/Resources/images/image1.jpeg से ऊपर समाधान पर पोस्ट किया है, लेकिन यदि मैं कहीं और फ़ोल्डर को स्थानांतरित करता हूं उदाहरण के लिए मेरे दस्तावेज़ फ़ोल्डर में प्रोजेक्ट नामक फ़ोल्डर में, तो मैं अपना कोड चाहता हूं अभी भी उस छवि को ढूंढने के लिए, क्या वह समाधान है जिसे आपने मुझे ठीक करने के लिए दिया है ??? क्या आपका समाधान काम करेगा ???? –

+0

@ user1766548 कृपया मेरे उत्तर में संस्करण देखें। आपके प्रश्न के लिए - हाँ यह काम करेगा ** अगर ** मैं आपकी समस्या को सही ढंग से समझ गया। –

+0

मैं इसे की कोशिश करेंगे और आपको यह बताने, धन्यवाद आपकी मदद के –

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