web-dev-qa-db-fra.com

Ouvrir le fichier avec l'application associée

je veux demander de l'aide pour ouvrir un fichier à partir de l'application C # avec l'application associée. J'ai essayé ceci:

      ProcessStartInfo pi = new ProcessStartInfo(file);
      pi.Arguments = Path.GetFileName(file);
      pi.UseShellExecute = true;
      pi.WorkingDirectory = Path.GetDirectoryName(file);
      pi.FileName = file;
      pi.Verb = "OPEN";
      Process.Start(pi);

ou ca:

      Process.Start(file);

où string file dans les deux exemples représente le chemin complet du fichier à ouvrir. Maintenant, tout fonctionne bien, à l'exception des images (jpg) avec l'application ACDSee. Les associations Irfanview fonctionnent bien, les documents MS Office également. Après avoir tenté d'ouvrir l'image jpg associée à acdsee, il ne fait qu'exécuter l'acdsee dans la zone de notification et n'ouvre pas le fichier.

J'ai découvert que, dans le registre CLASSES_ROOT pour les images * .jpg, il existe une valeur ACDSee.JPG en tant qu'application associée et sous cette clé, il y a dans le Shell-> Ouvrir-> Commande un chemin:

"C:\Program Files\ACD Systems\ACDSee\ACDSee.exe" /dde

et je pense que ce bizarre /dde est la raison pour laquelle je ne peux pas ouvrir le fichier. Je me suis rendu compte que dans la même clé reg Shell-> Open il y a quelques DDEExec entrées de clé avec la valeur [open("%1")]

Pour Irfan view ou une autre application cochée, il n’existe pas ddeexec, mais seulement la commande normale telle que

"C:\Program Files (x86)\IrfanView\i_view32.exe" "%1"

peut être exécuté à partir de la ligne de commande après avoir échangé le% 1 par nom de fichier, mais je ne pouvais pas exécuter la commande de acdsee entry dans la ligne de commande :(

Ma question est donc la suivante: comment puis-je configurer l'objet ProcessStartInfo en assurez-vous que tous les fichiers seront exécutés comme ce serait le cas dans l'explorateur avec un double-clic, les normes et ce DDEExec ceux? Y a-t-il autre chose comme DDEExec dont je devrais être au courant? merci et désolé pour mon EN

57
Zavael

Ecrivez

System.Diagnostics.Process.Start(@"file path");

exemple

System.Diagnostics.Process.Start(@"C:\foo.jpg");
System.Diagnostics.Process.Start(@"C:\foo.doc");
System.Diagnostics.Process.Start(@"C:\foo.dxf");
...

Et Shell exécutera le programme associé en le lisant dans le registre, comme le fait habituellement le double-clic.

106
Tigran

C'est un vieux fil, mais juste au cas où quelqu'un le verrait comme moi. pi.FileName doit être défini sur le nom du fichier (et éventuellement le chemin complet du fichier) de l'exécutable que vous souhaitez utiliser pour ouvrir votre fichier. Le code ci-dessous me permet d’ouvrir un fichier vidéo avec VLC.

var path = files[currentIndex].fileName;
var pi = new ProcessStartInfo(path)
{
    Arguments = Path.GetFileName(path),
    UseShellExecute = true,
    WorkingDirectory = Path.GetDirectoryName(path),
    FileName = "C:\\Program Files (x86)\\VideoLAN\\VLC\\vlc.exe",
    Verb = "OPEN"
};
Process.Start(pi)

La réponse de Tigrane fonctionne, mais utilisera l'application par défaut de Windows pour ouvrir votre fichier. Il peut donc être utile d'utiliser ProcessStartInfo si vous souhaitez ouvrir le fichier avec une application autre que celle par défaut.

15
Tree

Dans . Net Core (à partir de la version 2.2), il devrait être:

new Process
{
    StartInfo = new ProcessStartInfo(@"file path")
    {
        UseShellExecute = true
    }
}.Start();

Un problème lié à github peut être trouvé ici

3
Mehdi Dehghani