2010-06-18 8 views
7

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

समस्या है जब उपयोगकर्ता पर दो बार क्लिक एक .xyz फ़ाइल आता है और यह WPF आवेदन को खोलता है। एप्लिकेशन में अब निर्देशिका की एक कार्यशील निर्देशिका है जहां .xyz फ़ाइल स्थित है। अब प्रोग्राम को किसी भी फाइल (उपयोगकर्ता मैनुअल, पार्ट ड्रॉइंग इत्यादि) की आवश्यकता नहीं है।

सबसे अच्छा तरीका है इस प्रकार की समस्या को संभालने के लिए क्या है? मैं काम कर निर्देशिका (Environment.CurrentDirectory) सेट कर सकते हैं, लेकिन मेरे खुले फ़ाइल संवाद बॉक्स कार्यशील निर्देशिका बदल जाता है जब उपयोगकर्ता की बचत होती है या एक .xyz फ़ाइल को खोलता है। मैं भाग ड्राइंग के लिए एक पैकेट uri इस्तेमाल कर सकते हैं, लेकिन मैं उपयोगकर्ता मैनुअल के लिए Process.Start उपयोग करें, क्योंकि वे एक पीडीएफ कर रहे हैं। मैंने खोज करने की कोशिश की, लेकिन किसी भी चीज़ के साथ नहीं आ सकता था।

उत्तर

5

आप या तो निष्पादन की निर्देशिका का पता लगाकर या प्रतिबिंब का उपयोग कर एक assemly की डायरेक्टरी को खोजने में करके अपने को स्थापित निर्देशिका के लिए प्राप्त करने में सक्षम होना चाहिए निष्पादन योग्य, आप इस काम को करने के लिए Windows.Forms का संदर्भ जोड़ सकते हैं (स्वीकार्य रूप से आदर्श नहीं):

using System.IO; 
using System.Windows.Forms; 

string appPath = Path.GetDirectoryName(Application.ExecutablePath); 

का उपयोग प्रतिबिंब:

using System.IO; 
using System.Reflection; 

string path = Path.GetDirectoryName(Assembly.GetAssembly(typeof(MyClass)).CodeBase); 

या

string path = System.Reflection.Assembly.GetExecutingAssembly().Location; 

आप शायद सिर्फ़ अपने ऐप्लिकेशन के उस पथ ऑनलोड कैश के रूप में यह परिवर्तन नहीं होगा सकते हैं।

+0

Application.ExecutablePath WPF में मौजूद नहीं है, इसलिए मैं प्रतिबिंब का इस्तेमाल किया। यह पीडीएफ फाइलों के लिए काम करता है और छवि फ़ाइलों के लिए, मैं एक पैक यूआरआई का उपयोग कर रहा हूं। ऐसा लगता है कि इस scenerio को संभालने का कुछ बेहतर तरीका होगा। – awilinsk

+0

एक वैकल्पिक विधि जोड़ा गया ... – brendan

+0

[इस लिंक] के रूप में (http://stackoverflow.com/a/948438/419348) ने कहा, 'सिस्टम। रिफ्लेक्शन.एस्प्लर। गेटएक्सिंगिंगएस्प्लोरस()। स्थान 'के बाद स्थान मिल सकता है 'छाया-copying'। – AechoLiu

1

एक और चीज जो आप करना चाहते हैं बस स्टार्टअप पर वर्तमान कार्य निर्देशिका को रीसेट कर सकते हैं।

Directory.SetCurrentDirectory(GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location)); 

इससे आपको स्क्वायर मिल जाएगा।

-1

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

var filepath = System.Reflection.Assembly.GetExecutingAssembly().Location; 
var rootindex = filepath.IndexOf("TestProject\\"); 
var wordlength = "TestProject".Count(); 
var rootpath = filepath.Remove(rootindex + wordlength); 
sDir = filepath.Remove(rootindex + wordlength); 
//sDir = "c:\\dev\\Test_Solution\\TestProject"; 

मैं जानता हूँ कि इस बुनियादी सामान है, लेकिन मैं कुछ महीनों के लिए काम बंद किया गया है और कभी कभी यह स्पष्ट सामान के साथ थोड़ी सी मदद के लिए अच्छा है।

2

असेंबली के स्थान और एप्लिकेशन की कार्यशील निर्देशिका के बीच एक अंतर है। कभी-कभी ये वही हो सकते हैं, लेकिन यह मामला नहीं होना चाहिए। कार्य निर्देशिका को बदलने के लिए आप cmd.exe से अपने एप्लिकेशन को निष्पादित कर सकते हैं या Start in संपत्ति में एक अलग निर्देशिका के साथ शॉर्टकट बना सकते हैं।

आप इस तरह आवेदन की कार्यशील निर्देशिका प्राप्त कर सकते हैं:

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

नोट:. -Directory हमेशा वर्तमान कार्यशील निर्देशिका है, हम बस इसे का निरपेक्ष पथ मिलता है। कभी-कभी आपको पूर्ण पथ की आवश्यकता नहीं हो सकती है। उदाहरण के लिए आप काम कर निर्देशिका में एक फ़ाइल को पढ़ने के लिए चाहते हैं:

new StreamReader("./file-in-the-working-directory.txt"); 

या यहाँ तक कि:

new StreamReader("file-in-the-working-directory.txt"); 
+1

उन सभी अन्य उत्तरों का पक्ष क्यों लिया जाता है? यह एकमात्र सही है। अन्य सभी कार्यशील निर्देशिका के बजाय निष्पादन योग्य स्थान देते हैं। – marc40000

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