È un’applicazione associata a una determinata estensione?

A volte è auspicabile che l’applicazione apra l’applicazione predefinita per un file. Ad esempio, per aprire un file PDF è ansible utilizzare:

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

Per aprire un’immagine, devi semplicemente utilizzare lo stesso codice con un nome file diverso:

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

Alcune estensioni (.gif ad esempio) hanno quasi sempre un gestore predefinito, anche in un’installazione di base di Windows. Tuttavia, alcune estensioni (.pdf per esempio) spesso non hanno un’applicazione installata per gestirle.

In questi casi, sarebbe preferibile determinare se un’applicazione è associata all’estensione del file che si desidera aprire prima di effettuare la chiamata a Process.Start (fileName).

Mi chiedo come potresti implementare al meglio qualcosa del genere:

     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; } 

    Consiglierei di seguire il consiglio nella risposta di David, MA poiché è necessario rilevare un’associazione:

    Per verificare se un file ha un’associazione puoi usare la funzione nativa FindExecutable che è fondamentalmente ciò che Windows Explorer usa internamente … dà un bel codice di errore ( SE_ERR_NOASSOC ) se non c’è alcuna associazione. Al successo dà un percorso al rispettivo eseguibile.

    Thee DllImport per quello è

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

    Un’altra opzione potrebbe essere quella di aprire il registro ad esempio (sconsigliato in quanto complesso a causa di diversi aspetti come WoW64, ecc.):

    La vera associazione è memorizzata nella chiave che HKEY_CLASSES_ROOT\.pdf punta a – nel mio caso AcroExch.Document , quindi eseguiamo il checkout HKEY_CLASSES_ROOT\AcroExch.Document . Qui puoi vedere (e modificare) quale comando verrà utilizzato per avviare quel tipo di file:

     HKEY_CLASSES_ROOT\AcroExch.Document\shell\open\command 

    In una situazione come questa l’approccio migliore è cercare di aprire il documento e rilevare il fallimento. Cercando di prevedere se un’associazione di file è triggers o meno, ti basterà implementare nuovamente le API di esecuzione della shell. È molto difficile ottenere ciò esattamente giusto e piuttosto inutile dal momento che esistono già!

    @Yahia ottiene il cenno del capo. Sto postando la mia soluzione rapida per i posteri in modo da poter vedere con cosa sono andato. Ci sono molti possibili miglioramenti a questo codice, ma questo ti darà l’idea:

     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); 

    Avrai anche un’occhiata al registro per ottenere queste informazioni.

    Puoi seguire da:

     HKEY_CLASSES_ROOT\.extension 

    e di solito porta a qualcosa come HKEY_CLASSES_ROOT\extfile\Shell\Open\Command

    e arriverete al comando per aprire il tipo di file.

    A seconda di ciò che stai facendo, potrebbe essere l’ideale chiedere semplicemente perdono (cioè, basta aprire il file e vedere)

    Tutte queste informazioni sono presenti nel Registro di sistema. È ansible spostarsi su HKEY_CLASSES_ROOT, trovare l’estensione e passare da lì per trovare il gestore predefinito. Ma a seconda del tipo di file e del gestore associato (s) è necessario guadare in CLSID e whatnot … probabilmente stai meglio prendere un’eccezione invece.

    Questa informazione è nel registro. Per esempio:

     # Mount the HKCR drive in powershell ps c:\> new-psdrive hkcr registry hkey_classs_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_classs_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")