2012-03-02 19 views
12

कभी-कभी आपकी एप्लिकेशन को फ़ाइल के लिए डिफ़ॉल्ट एप्लिकेशन खोलने के लिए वांछनीय होता है। उदाहरण के लिए, एक PDF फ़ाइल को खोलने के लिए आप उपयोग कर सकते हैं:एक दिया गया विस्तार के साथ संबद्ध एक आवेदन है?

System.Diagnostics.Process.Start("Filename.pdf"); 


एक छवि खोलने के लिए, तुम सिर्फ एक अलग फ़ाइल नाम के साथ एक ही कोड का उपयोग करेंगे:

System.Diagnostics.Process.Start("Filename.gif"); 


कुछ एक्सटेंशन (उदाहरण के लिए .gif) बस एक मूल हैंडलर के बारे में, बस मूल विंडोज स्थापना में भी। हालांकि, कुछ एक्सटेंशन (उदाहरण के लिए .pdf) में अक्सर उन्हें संभालने के लिए कोई एप्लिकेशन इंस्टॉल नहीं होता है।

इन मामलों में, यह निर्धारित करने के लिए वांछनीय होगा कि फ़ाइल को उस प्रक्रिया के विस्तार से जोड़ा गया है, जिसे आप प्रक्रिया करने के लिए कॉल करने से पहले खोलना चाहते हैं। स्टार्ट (फ़ाइल नाम)।

मैं सोच रहा हूँ कि कैसे आप सबसे अच्छा कुछ इस तरह लागू हो सकता है:

static bool ApplicationAssociated(string extension) 
{ 
    var extensionHasAssociatedApplication = false; 

    var condition = // Determine if there is an application installed that is associated with the provided file extension.; 
    if (condition) 
    { 
     extensionHasAssociatedApplication = true; 
    } 

    return extensionHasAssociatedApplication; 
} 
+0

यह रजिस्टर संपादक में कहीं है। चुंबक के लिए हैंडलरों के साथ :, mailto :, कॉल: योजनाएं आदि। अगर मुझे सही – f2lollpll

उत्तर

25

मैं करूंगा David's answer में सलाह निम्नलिखित लेकिन जब से तुम एक संघ का पता लगाने की जरूरत है की सिफारिश:

एक फाइल एक संघ आप देशी समारोह FindExecutable जो मूल रूप से है उपयोग कर सकते हैं कि क्या जांच करने के लिए क्या Windows Explorer आंतरिक रूप से उपयोग करता है ... यदि कोई सहयोग नहीं है तो यह एक अच्छा त्रुटि कोड (SE_ERR_NOASSOC) देता है। सफलता पर यह संबंधित निष्पादन योग्य के लिए एक रास्ता देता है।

तुमको DllImport के लिए यह है

[DllImport("shell32.dll")] 
static extern int FindExecutable(string lpFile, string lpDirectory, [Out] StringBuilder lpResult); 

एक अन्य विकल्प उदाहरण (जटिल के बाद से अनुशंसित नहीं के लिए रजिस्ट्री चलना होगा WOW64 आदि जैसे कई aspets की वजह से):

असली एसोसिएशन HKEY_CLASSES_ROOT\.pdf अंक में संग्रहीत है - मेरे मामले में AcroExch.Document, इसलिए हम HKEY_CLASSES_ROOT\AcroExch.Document चेकआउट करते हैं। वहां आप देख सकते हैं (और बदलें) उस प्रकार की फ़ाइल लॉन्च करने के लिए किस कमांड का उपयोग किया जा रहा है:

HKEY_CLASSES_ROOT\AcroExch.Document\shell\open\command 
5

इस सबसे अच्छा तरीका की तरह एक स्थिति में दस्तावेज़ को खोलने और विफलता का पता लगाने के लिए प्रयास करने के लिए है। यह अनुमान लगाने की कोशिश कर रहा है कि फाइल एसोसिएशन जगह पर है या नहीं, सिर्फ आपको खोल निष्पादन API को पुन: कार्यान्वित करने की ओर जाता है। यह वास्तव में सही है और इसके बजाय अनावश्यक है क्योंकि वे पहले से मौजूद हैं!

+0

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

+0

धन्यवाद। मैं उस दृष्टिकोण को भी पसंद करूंगा। मैं नहीं कर सकता, कारणों से मैं आपको नहीं बोलेगा। कल्पना बहुत विशिष्ट है, और जबकि मैं कारणों से सहमत नहीं हूं, मेरे पास नौकरी है। –

+0

@zmbq यदि आप नहीं चाहते हैं कि उपयोगकर्ता दस्तावेज़ देखें तो आप इसे खोलने से बचें। –

1

आप उस जानकारी को प्राप्त करने के लिए रजिस्ट्री को भी देखेंगे।

आप से पालन कर सकते हैं:

HKEY_CLASSES_ROOT\.extension 

और यह आमतौर पर की तरह HKEY_CLASSES_ROOT\extfile\Shell\Open\Command

कुछ की ओर जाता है और आप फ़ाइल प्रकार को खोलने के लिए आदेश आ जाएगा।

तुम क्या कर रहे पर निर्भर करता है, यह सिर्फ माफी के लिए पूछने की (जो है, बस फ़ाइल को खोलने और देखें)

+0

क्या आप वाकई पर्याप्त हैं? विजुअल स्टूडियो कुछ प्रकार के वूडू जादू, जहां .sln फ़ाइलों के पास विजुअल स्टूडियो संस्करण के आधार पर एक अलग आइकन होता है जो उन्हें बनाया गया है। यह डरावना है, और संभवतः संग्रहीत नहीं किया गया जहां आपने कहा था। – zmbq

+0

@zmbq - यदि आप 'HKEY_CLASSES_ROOT' देखते हैं, तो आपको एक एसएलएन फ़ाइल के लिए अलग-अलग परिभाषा दिखाई देगी, जिसे वीएस के विभिन्न संस्करणों द्वारा संभाला जाता है। आइकन को 'डिफ़ॉल्ट आइकन' के तहत परिभाषित किया गया है। असल में, सभी जानकारी वहाँ है। http://stackoverflow.com/questions/4693562/how-does- विन्डोज़-now-what-version-of-visual-studio-a-sln-file-relates-to – manojlds

1

है कि सूचना के सभी रजिस्ट्री में रहती आदर्श हो सकता है .. अगर आप HKEY_CLASSES_ROOT करने के लिए नेविगेट कर सकता है , एक्सटेंशन को ढूंढें और डिफ़ॉल्ट हैंडलर ढूंढने के लिए वहां से जाएं। लेकिन फ़ाइल के प्रकार और संबंधित हैंडलर के आधार पर आपको सीएलएसआईडी में प्रवेश करना होगा और क्या नहीं ... आप शायद इसके बजाय अपवाद को पकड़ने से बेहतर हैं।

1

यह जानकारी रजिस्ट्री में है। उदाहरण के लिए:

# Mount the HKCR drive in powershell 
ps c:\> new-psdrive hkcr registry hkey_classes_root 
ps c:\> cd hkcr:\.cs 

# get default key for .cs 
PS hkcr:\.cs> gp . "" 
(default) : VisualStudio.cs.10.0 
... 

# dereference the "open" verb 
PS hkcr:\.cs> dir ..\VisualStudio.cs.10.0\shell\open 

    Hive: hkey_classes_root\VisualStudio.cs.10.0\shell\open 

Name       Property 
----       -------- 
Command      (default) : "C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\devenv.exe" /dde 
ddeexec      (default) : Open("%1") 
4

@ याहिया को मंजूरी मिलती है। मैं वंशावली के लिए अपना त्वरित समाधान पोस्ट कर रहा हूं ताकि आप देख सकें कि मैं किसके साथ गया था। इस कोड में बहुत सारे संभावित सुधार हैं, लेकिन यह आपको विचार देगा:

public static bool HasExecutable(string path) 
{ 
    var executable = FindExecutable(path); 
    return !string.IsNullOrEmpty(executable); 
} 

private static string FindExecutable(string path) 
{ 
    var executable = new StringBuilder(1024); 
    FindExecutable(path, string.Empty, executable); 
    return executable.ToString(); 
} 

[DllImport("shell32.dll", EntryPoint = "FindExecutable")] 
private static extern long FindExecutable(string lpFile, string lpDirectory, StringBuilder lpResult); 
+0

आपने स्ट्रिंगबिल्डर (1024) का उपयोग क्यों किया StringBuilder()? – mggSoft

+3

@mggSoft मूल विधि FindExecutable को निष्पादन योग्य पथ को वापस करने के लिए एक बफर की आवश्यकता होती है। दस्तावेज़ीकरण निर्दिष्ट करता है कि _This पैरामीटर में एक वैध गैर-शून्य मान होना चाहिए और इसे MAX_PATH_ की लंबाई माना जाता है। तो जबकि 1024 थोड़ा अधिक है, MAX_PATH (260) के मान के साथ डिफ़ॉल्ट स्ट्रिंगबिल्डर क्षमता को ओवरराइड करने की अनुशंसा की जाती है। – Yaurthek

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