2011-12-28 9 views
10

हमारे पास शॉर्टकट (.lnk फ़ाइलें) से भरा नेटवर्क ड्राइव है जो फ़ोल्डरों को इंगित करता है और मुझे उन्हें C# Winforms ऐप में प्रोग्रामेटिक रूप से पार करने की आवश्यकता है।प्रोग्रामिंग के लिए .lnk फ़ाइल का पालन कैसे करें

व्यावहारिक विकल्प मेरे पास है?

+1

खोल लिंक इंटरफ़ेस का उपयोग करें: http://msdn.microsoft.com/en-us/library/windows/desktop/bb776891(v=vs.85).aspx –

+1

क्या होगा यदि शॉर्टकट नहीं होता एक फाइल को इंगित करें? – vcsjones

+0

@vcsjones अगर इसे नहीं छोड़ा जा सकता है। सौभाग्य से यह बंद कर दिया गया है और केवल नेटवर्क इंजीनियरों द्वारा उपयोग किया जाता है। – user1231231412

उत्तर

11

IWshRuntimeLibrary को अपनी परियोजना के संदर्भ के रूप में जोड़ें। संदर्भ, COM टैब, विंडोज स्क्रिप्टिंग होस्ट ऑब्जेक्ट मॉडल जोड़ें।

IWshRuntimeLibrary.IWshShell wsh = new IWshRuntimeLibrary.WshShellClass(); 
IWshRuntimeLibrary.IWshShortcut sc = (IWshRuntimeLibrary.IWshShortcut)wsh.CreateShortcut(filename); 

शॉर्टकट वस्तु "अनुसूचित जाति" एक TargetPath संपत्ति है:

यहाँ कैसे मैं एक शॉर्टकट के गुण प्राप्त है।

+6

आपके ** सरल और व्यावहारिक ** सुझाव और उदाहरण के लिए धन्यवाद और मुझे खोदने के लिए और अधिक जानकारी नहीं दी। एक बात जो मैं आपके उत्तर में जोड़ने का सुझाव दूंगा वह यह है कि आप IWshRuntimeLibrary प्राप्त करने के लिए COM ऑब्जेक्ट "विंडोज स्क्रिप्ट होस्ट ऑब्जेक्ट मॉडल" का संदर्भ जोड़ते हैं। – user1231231412

+0

खुशी मैं मदद कर सकता था! – djdanlib

+0

बस इतना है कि किसी और को बेवकूफ गलतियों पर इतना समय बर्बाद नहीं करना है: उपर्युक्त उदाहरण में फ़ाइल नाम निश्चित रूप से फ़ाइल होना चाहिए। फ़ाइल नाम फ़ाइल पढ़ने पर फ़ाइल नाम, फ़ाइल नहीं। नाम। – Alex

0
  1. COM IPersistFile इंटरफ़ेस का उपयोग कर फ़ाइल लोड करें।
  2. इसे एक आईशेल लिंक इंटरफ़ेस में बदलने के लिए परिणाम पर एक क्वेरी इंटरफ़ेस करें।
  3. कॉल IShellLink :: GetPath

जहां तक ​​मेरा जानकारी है आप नेट आप के लिए इन इंटरफेस "संदर्भ जोड़ें" संवाद बॉक्स का उपयोग कर से प्रत्येक के अनुरूप वर्गों उत्पन्न हो सकता है।

+0

इसके लिए धन्यवाद। संदर्भ के रूप में मैं कौन सी फाइल जोड़ रहा हूं? – user1231231412

+0

@ जोनसी: मुझे नहीं पता। मुझे पता है कि माना जाता है कि आप एक संदर्भ के रूप में एक CoClass जोड़ सकते हैं। मैंने कुछ नहीं किया है। –

0

आईशेल लिंक इंटरफ़ेस आपको .lnk फ़ाइलों में हेरफेर करने देता है, हालांकि यह सी # से उपयोग करने के लिए थोड़ा दर्द है।

This article में आवश्यक इंटरऑप गब्बिन्स को लागू करने वाला कुछ कोड है।

अद्यतन

आप लेख here से कोड प्राप्त कर सकते हैं लेकिन पेज फ़ायरफ़ॉक्स में काम करने के लिए प्रतीत नहीं होता। यह आईई में काम करता है।

+1

धन्यवाद, लेकिन स्रोत गुम है और वह ब्लॉग में कुछ भी उपयोगी नहीं है। – user1231231412

+0

@ जोनसी: मुझे स्रोत मिला, ऊपर मेरा अपडेट देखें। – arx

0

मैं इसे सही तरीका और है कि lnk फ़ाइल संरचनाओं आदि को बदल सकते हैं पता है, लेकिन यह मैं क्या कर रहा है:

private static string LnkToFile(string fileLink) 
    { 
     string link = File.ReadAllText(fileLink); 
     int i1 = link.IndexOf("DATA\0"); 
     if (i1 < 0) 
      return null; 
     i1 += 5; 
     int i2 = link.IndexOf("\0", i1); 
     if (i2 < 0) 
      return link.Substring(i1); 
     else 
      return link.Substring(i1, i2 - i1); 
    } 
1

आप COM संदर्भ के लिए, और वितरित इंटरॉप नहीं करना चाहते हैं।

आप नए गतिशील कॉम के बजाय का उपयोग कर सकते हैं: अपने उत्पाद (झूठी जे रिग्स "एम्बेड Interop प्रकार" याद) के साथ IWshRuntimeLibrary.dll।

private void Window_Drop(object sender, DragEventArgs e) 
{ 
    if (e.Data.GetDataPresent(DataFormats.FileDrop)) 
    { 
     string[] files = (string[])e.Data.GetData(DataFormats.FileDrop); 
     dynamic shortcut; 
     dynamic windowsShell; 
     try 
     { 
      var file = files[0]; 
      if (Path.GetExtension(file)?.Equals(".lnk",StringComparison.OrdinalIgnoreCase) == true) 
      { 
       Type shellObjectType = Type.GetTypeFromProgID("WScript.Shell"); 
       windowsShell = Activator.CreateInstance(shellObjectType); 
       shortcut = windowsShell.CreateShortcut(file); 
       file = shortcut.TargetPath; 
       // Release the COM objects 
       shortcut = null; 
       windowsShell = null; 
      } 
      // 
      // <use file>... 
      // 
     } 
     finally 
     { 
      // Release the COM objects 
      shortcut = null; 
      windowsShell = null; 
     } 
    } 
} 
संबंधित मुद्दे