2008-10-03 14 views
9

में सापेक्ष पथ मैं विजुअल स्टूडियो 2005 में काम कर रहा हूं और एक टेक्स्ट फ़ाइल जोड़ दी है जिसे समाधान एक्सप्लोरर में प्रोजेक्ट पर राइट-क्लिक करके पार्स किया जाना चाहिए और>> नया आइटम जोड़ें। यह प्रोजेक्ट फ़ोल्डर में .txt फ़ाइल रखता है। डीबग .exe फ़ाइल/bin/डीबग फ़ोल्डर में है।विजुअल स्टूडियो

मैं रिश्तेदार पथों का उपयोग करके कोड से txt फ़ाइल को सही तरीके से कैसे इंगित करूं जो दो फ़ोल्डरों को ठीक से हल कर देगा, जबकि समाधान प्रकाशित होने के बाद उसी फ़ोल्डर में भी हल हो रहा है?

+0

मैं भी यह जानना चाहता हूं। मैं हमेशा निराश हूं लेकिन वीएस में सख्त कोड पथ। विशेष रूप से जब आपके पास नैन बिल्ड फाइलें होती हैं। – flukus

उत्तर

5

Application Class देखें। इसमें कई सदस्य हैं जिनका उपयोग एप्लिकेशन के सापेक्ष फाइलों आदि के लिए किया जा सकता है।

उदाहरण के लिए, एप्लिकेशन। एक्सटेक्टेबलपैथ आपको बताता है कि चल रही EXE फ़ाइल कहां स्थित है; फिर आप फ़ाइल को खोजने के लिए एक सापेक्ष पथ का उपयोग कर सकते हैं उदा। .. \ .. \ FileToBeParsed.txt। हालांकि, यह मानता है कि फ़ाइलों को एक ही फ़ोल्डर संरचना में प्रोजेक्ट फ़ोल्डर संरचना के रूप में तैनात किया गया है, जो आम तौर पर मामला नहीं है।

प्रोजेक्ट तैनात होने के बाद एप्लिकेशन से संबंधित फ़ाइलों का पता लगाने के लिए CommonAppDataPath और LocalUserAppDataPath जैसे गुणों पर विचार करें।

1

आप बिल्ड आउटपुट फ़ोल्डर में .txt फ़ाइल की प्रतिलिपि बनाने के लिए एक पोस्ट-बिल्ड ईवेंट जोड़ सकते हैं। फिर आपका कोड यह मान सकता है कि फ़ाइल निष्पादन योग्य के समान फ़ोल्डर में है।

3

मैं एक पोस्ट का निर्माण कदम है कि प्रतियां सक्रिय विन्यास के उत्पादन फ़ोल्डर में txt फ़ाइल जोड़ना होगा:

xcopy "$(ProjectDir)*.txt" "$(OutDir)" 

"के रूप में $(ConfigurationName)" इस प्रकार निर्धारित कुछ मैक्रो रहे हैं, $(ProjectDir)

9

तो मैं समझता हूँ कि अपने सही ढंग से सवाल करें: "समाधान एक्सप्लोरर" में फ़ाइल का चयन करें। गुणों के तहत -> आउटपुट निर्देशिका में कॉपी करें, "हमेशा कॉपी करें" या "नई अगर कॉपी करें" का चयन करें। क्रिया बनाने के लिए, "सामग्री" चुनें। यह फ़ाइल को प्रतिलिपि बनायेगा निर्माण पर/bin/डीबग फ़ोल्डर। आप इसे प्रोजेक्ट रूट से तब तक संदर्भित करने में सक्षम होना चाहिए।

4

डिस्क पर फ़ाइल का पता लगाने का एक विकल्प फ़ाइल को सीधे एम्बेडेड संसाधन के रूप में संकलित असेंबली में शामिल करना होगा। ऐसा करने के लिए, फ़ाइल पर राइट-क्लिक करें और बिल्ड एक्शन के रूप में "एंबेडेड संसाधन" चुनें। इसके बाद आप एक बाइट धारा के रूप में फ़ाइल को प्राप्त कर सकते हैं:

Assembly thisAssembly = Assembly.GetExecutingAssembly(); 
Stream stream = thisAssembly.GetManifestResourceStream("Namespace.Folder.Filename.Ext"); 
byte[] data = new byte[stream.Length]; 
stream.Read(data, 0, (int)stream.Length); 

अधिक एम्बेड किए गए संसाधनों के बारे में जानकारी here और here पाया जा सकता है।

यदि आप अपने स्वयं के उपयोग के लिए आवेदन बना रहे हैं, तो डेविड क्रेप का सुझाव सबसे अच्छा है: बस फ़ाइल को आउटपुट निर्देशिका में कॉपी करें। यदि आप एक असेंबली का निर्माण कर रहे हैं जिसे पुन: उपयोग या वितरित किया जाएगा, तो एम्बेडेड संसाधन विकल्प बेहतर है क्योंकि यह सब कुछ एक .dll में पैकेज करेगा।

1

जाओ परियोजना के लिए गुण -> विन्यास गुण -> डिबगिंग

सेट "कार्य निर्देशिका" $ करने के लिए (TARGETDIR)

तो फिर तुम ठीक से अपने कोड में एक रिश्तेदार पथ का उपयोग कर अपनी फ़ाइल संदर्भित कर सकते हैं (उदाहरण के लिए " .... \ foo.xml ")

2

आवेदन। एक्सटेक्टेबल पाथ समाधान unittests के लिए काम नहीं करता है। Vstesthost का मार्ग।exe वापस कर दिया जाएगा

सिस्टम। रिफ्लेक्शन.एस्प्लोरस। गेटएक्सिंगिंगएस्परब्स()। स्थान काम करेगा लेकिन असेंबली नाम के साथ पथ प्रदान करेगा।

तो यह काम करता है:
System.Reflection.Assembly.GetExecutingAssembly().Location + "\..\" + "fileToRead.txt"

लेकिन अभी:

fileToRead.txt 

वर्क्स भी। काम करता है निर्देशिका डिफ़ॉल्ट रूप से निष्पादन असेंबली निर्देशिका है।

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