2009-05-03 13 views
71

अपने पथ को हार्डकोड के साथ एक बाहरी प्रोग्राम चलाने के बजाय, मैं वर्तमान प्रोजेक्ट डिर प्राप्त करना चाहता हूं। मैं कस्टम कार्य में एक प्रक्रिया का उपयोग कर एक बाहरी कार्यक्रम बुला रहा हूँ।कस्टम MSBuild कार्य बनाते समय आप C# कोड से वर्तमान प्रोजेक्ट निर्देशिका कैसे प्राप्त करते हैं?

मैं यह कैसे करूँगा? AppDomain.CurrentDomain.BaseDirectory मुझे बस वीएस 2008 का स्थान देता है।

उत्तर

74

आप इन दो विधियों में से किसी एक को आजमा सकते हैं।

string startupPath = System.IO.Directory.GetCurrentDirectory(); 

string startupPath = Environment.CurrentDirectory; 

मुझे बताओ, जो आपके लिए लगता है बेहतर

+39

ये दो उपरोक्त आपको बिन निर्देशिका में इंगित करते हैं, इसलिए यदि आपके उदाहरण के लिए आपके पूरे समाधान के लिए एक बिन निर्देशिका है, तो यह आपको वहां बताएगा और आपकी प्रोजेक्ट निर्देशिका (या आपकी परियोजना निर्देशिका के नीचे दो स्तर) नहीं – matcheek

+0

पर्यावरण। वर्तमान डायरेक्टरी मेरे लिए भी काम किया है – MissPiplup

-6

Directory.GetParent (Directory.GetCurrentDirectory())। Parent.Parent.Parent.Parent.FullName

आप परियोजना निर्देशिका देंगे ।

+57

वास्तव में? मुझे लगता है कि आप Directory.GetParent() के लिए एक अभिभावक – sean

4

मैं भी इसकी तलाश कर रहा था। मेरे पास एक प्रोजेक्ट है जो एचडब्ल्यूसी चलाता है, और मैं वेब साइट को ऐप पेड़ से बाहर रखना चाहता हूं, लेकिन मैं इसे डीबग (या रिलीज) निर्देशिका में रखना नहीं चाहता हूं। Fwiw, स्वीकार किए जाते हैं समाधान (और साथ ही यह एक) केवल निर्देशिका निष्पादन में चल रहा है को पहचानती है।

कि निर्देशिका ढूंढने के लिए, मैं

string startupPath = System.IO.Path.GetFullPath(".\\"). 
2

उपयोग कर रहे हैं मैं एक ऐसी ही स्थिति थी, और फलहीन Googles के बाद, मैंने एक सार्वजनिक स्ट्रिंग घोषित की, जो परियोजना पथ प्राप्त करने के लिए डीबग/रिलीज पथ का एक स्ट्रिंग मान संशोधित करता है।

public string DirProject() 
{ 
    string DirDebug = System.IO.Directory.GetCurrentDirectory(); 
    string DirProject = DirDebug; 

    for (int counter_slash = 0; counter_slash < 4; counter_slash++) 
    { 
     DirProject = DirProject.Substring(0, DirProject.LastIndexOf(@"\")); 
    } 

    return DirProject; 
} 

फिर आप इसे कहते हैं जब भी आप चाहते हैं सक्षम हो जाएगा: इस पद्धति का उपयोग का एक लाभ यह है कि क्योंकि यह currect परियोजना की निर्देशिका का उपयोग करता है, यह नहीं मायने रखती है अगर आप एक डिबग निर्देशिका या एक रिलीज निर्देशिका से काम कर रहे हैं है केवल एक लाइन का उपयोग:

string MyProjectDir = DirProject(); 

यह सबसे मामलों में काम करना चाहिए।

2

आखिरकार मैंने जवाब देने के लिए सार्वजनिक तारों के बारे में अपना पहला जवाब पॉलिश करने के बाद, यह मेरे सामने आ गया कि आप शायद वांछित परिणाम प्राप्त करने के लिए रजिस्ट्री से एक मूल्य पढ़ सकते हैं। यह पता चला है के रूप में, उस मार्ग भी कम था:

RegistryKey Projects_Key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\VisualStudio\9.0", false); 
string DirProject = (string)Projects_Key.GetValue(@"DefaultNewProjectLocation"); 
:

using Microsoft.Win32; // required for reading and/or writing the registry 

यहां मुख्य कोड है:

सबसे पहले, आप तो आप रजिस्ट्री के साथ काम कर सकते हैं Microsoft.Win32 नाम स्थान में शामिल करना चाहिए

इस उत्तर पर एक नोट:

मैं विजुअल स्टूडियो 2008 व्यावसायिक संस्करण का उपयोग कर रहा हूं। यदि आप किसी अन्य संस्करण का उपयोग कर रहे हैं, (यानी 2003, 2005, 2010; आदि), तो आपको उपकी स्ट्रिंग (यानी 8.0, 7.0; आदि) के 'संस्करण' भाग को संशोधित करना होगा।

यदि आप मेरे उत्तरों में से एक का उपयोग करते हैं, और यदि यह पूछने के लिए बहुत कुछ नहीं है, तो मैं जानना चाहूंगा कि आपने किन तरीकों का उपयोग किया और क्यों। सौभाग्य।

  • dm
154

मुझे आशा है कि यह मदद मिलेगी:

Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName; 

इस परियोजना निर्देशिका

+17

+1 खो रहे हैं, इसलिए हमें \ bin \ Debug निर्देशिका नहीं मिलती है :) –

+2

क्या होगा यदि हम कस्टम लक्ष्य CPU का उपयोग करते हैं? उदाहरण के लिए, यदि मैंने अपना निर्माण x64 को लक्षित करने के लिए सेट किया है तो यह उन लोगों के बीच एक और फ़ोल्डर बनाता है। –

+0

यह सही उत्तर है। स्वीकार्य उत्तर बिन निर्देशिका का मार्ग देता है, जो प्रोजेक्ट निर्देशिका नहीं है। – pookie

6

क्या आप जानते OT निर्देशिका जहां अपने समाधान स्थित है क्या चाहते हैं मिल जाएगा

var parent = Directory.GetParent(Directory.GetCurrentDirectory()).Parent; 
      if (parent != null) 
      { 
       var directoryInfo = parent.Parent; 
       string startDirectory = null; 
       if (directoryInfo != null) 
       { 
        startDirectory = directoryInfo.FullName; 
       } 
       if (startDirectory != null) 
       { /*Do whatever you want "startDirectory" variable*/} 
      } 
: आप इस सब करने की ज़रूरत

आप केवल GetCurrrentDirectory() विधि के साथ करते हैं, तो आप कोई फर्क नहीं पड़ता अगर आप डीबग कर रहे हैं या जारी निर्माण फ़ोल्डर मिलता है। मुझे आशा है कि यह मदद! आप सत्यापन के बारे में भूल जाते हैं तो वह ऐसा होगा:

var startDirectory = Directory.GetParent(Directory.GetCurrentDirectory()).Parent.Parent.FullName; 
3

इस

string startupPath = System.IO.Directory.GetParent(@"./").FullName; 

करने के लिए आप

string startupPath = System.IO.Directory.GetParent(@"../").FullName; 

हो सकता है कि वहाँ बेहतर हैं बिन फ़ोल्डर में पथ प्राप्त करना चाहते हैं एक और तरीका है जिस तरह =)

3

उपयोग इस परियोजना निर्देशिका पाने के लिए (मेरे लिए) काम किया:

string projectPath = 
    Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName; 
10

यह आपको वर्तमान निष्पादन निर्देशिका से दो स्तरों पर नेविगेट करके प्रोजेक्ट निर्देशिका भी देगा (यह प्रत्येक निर्माण के लिए प्रोजेक्ट निर्देशिका नहीं लौटाएगा, लेकिन यह सबसे आम है)।

System.IO.Path.GetFullPath(@"..\..\") 

बेशक आप सत्यापन/त्रुटि से निपटने के तर्क के कुछ प्रकार के अंदर इस को रोकने के लिए चाहते हैं।

+0

आईएमओ यह सबसे लचीली विधि है। मैं इसे यूनिट परीक्षण और एकीकरण परीक्षण से उपयोग कर रहा हूं, जो पथ वास्तव में एक फ़ोल्डर का गहरा है। – Soleil

2

फिर भी एक और अपूर्ण समाधान (लेकिन शायद दूसरों की तुलना में सही करने के लिए एक छोटे से करीब):

protected static string GetSolutionFSPath() { 
     return System.IO.Directory.GetParent(System.IO.Directory.GetCurrentDirectory()).Parent.Parent.FullName; 
    } 
    protected static string GetProjectFSPath() { 
     return String.Format("{0}\\{1}", GetSolutionFSPath(), System.Reflection.Assembly.GetExecutingAssembly().GetName().Name); 
    } 

इस संस्करण मौजूदा परियोजनाओं ' फ़ोल्डर वापस आ जाएगी, भले ही चालू परियोजना Startup Project नहीं है समाधान के लिए।

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

एक और (अधिक संभावना) समस्या जो आप चला सकते हैं वह यह है कि परियोजना का नाम प्रोजेक्ट के लिए फ़ोल्डर नाम से मेल खाना चाहिए।

एक अन्य समस्या आप हो सकता है कि इस परियोजना समाधान फ़ोल्डर के अंदर होना चाहिए है। यह आमतौर पर एक समस्या नहीं है, लेकिन आप समाधान के लिए परियोजना को जोड़ने के लिए Add Existing Project to Solution विकल्प का उपयोग किया है तो इस तरह से अपने समाधान आयोजित किया जाता है नहीं हो सकता।

आखिरकार, यदि आप आवेदन कर रहे हैं तो कार्यशील निर्देशिका में संशोधन होगा, आपको यह मान करने से पहले इस मान को स्टोर करना चाहिए क्योंकि यह मान वर्तमान कार्यशील निर्देशिका के सापेक्ष निर्धारित है।

बेशक

, यह सब भी मतलब है कि आप अपनी परियोजनाओं को 'Build के लिए डिफ़ॉल्ट मान छेड़छाड़ नहीं कर सकते ->Output path या Debug - परियोजना गुण संवाद में>Working directory विकल्प।

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