2009-08-16 11 views
19

-Edit- Czuję się jak idiota. Miałem wrażenie, że poniższa odpowiedź zadziała, ale nie zobaczy żadnych wyników w Google podobnych do poniższych odpowiedzi. Kiedy zobaczyłem ten złożony kod, pomyślałem, że tak musi być.Jak uruchomić pliki w C#

Szukałem i znalazłem to Windows: List and Launch applications associated with an extension jednak nie odpowiedziałem na moje pytanie. Z poprawkami poniżej wymyśliłem poniżej. Jednak utknie on w plikach graficznych. Pliki Txt działają dobrze

Wkrótce zaktualizuję ten kod, aby uwzględnić ścieżki aplikacji ze spacjami, ale nie rozumiem, dlaczego pliki obrazów nie uruchamiają się.

static void launchFile(string fn) 
{ 
    //majority was taken from 
    //https://stackoverflow.com/questions/24954/windows-list-and-launch-applications-associated-with-an-extension 
    const string extPathTemplate = @"HKEY_CLASSES_ROOT\{0}"; 
    const string cmdPathTemplate = @"HKEY_CLASSES_ROOT\{0}\shell\open\command"; 

    string ext = Path.GetExtension(fn); 

    var extPath = string.Format(extPathTemplate, ext); 

    var docName = Registry.GetValue(extPath, string.Empty, string.Empty) as string; 
    if (!string.IsNullOrEmpty(docName)) 
    { 
     // 2. Find out which command is associated with our extension 
     var associatedCmdPath = string.Format(cmdPathTemplate, docName); 
     var associatedCmd = Registry.GetValue(associatedCmdPath, string.Empty, string.Empty) as string; 

     if (!string.IsNullOrEmpty(associatedCmd)) 
     { 
      //Console.WriteLine("\"{0}\" command is associated with {1} extension", associatedCmd, ext); 
      var p = new Process(); 
      p.StartInfo.FileName = associatedCmd.Split(' ')[0]; 
      string s2 = associatedCmd.Substring(p.StartInfo.FileName.Length + 1); 
      s2 = s2.Replace("%1", string.Format("\"{0}\"", fn)); 
      p.StartInfo.Arguments = s2;//string.Format("\"{0}\"", fn); 
      p.Start(); 
     } 
    } 
} 
+0

czy chcesz tylko uruchamiać pliki w systemie Windows? –

+0

Co stanie się z tymi plikami graficznymi, jeśli próbujesz zapisać cokolwiek, co wynika z instrukcji debugowania, tylko w wierszu poleceń? –

Odpowiedz

75

Zastosowanie:

System.Diagnostics.Process.Start(filePath); 

będzie używać domyślnego programu, który byłby otwarty, jakby po prostu kliknąć na nim. Wprawdzie nie pozwala wybrać programu, który będzie działał ... ale zakładając, że chcesz naśladować zachowanie, które byłoby używane, gdyby użytkownik dwukrotnie kliknął plik, powinno to działać dobrze.

+4

Aww, ty * właśnie * pokonałeś mnie :) –

+0

hahaah Właśnie chciałem napisać to samo :-) lol –

+0

jakbyś chciałeś otworzyć go z konkretnym programem, chcę otworzyć go z "Windows PowerShell ISE" –

10

To naprawdę brzmi jak szukasz więcej do tego:

System.Diagnostics.Process proc = new System.Diagnostics.Process(); 
proc.EnableRaisingEvents = false; 
proc.StartInfo.FileName = "<whatever>"; 
proc.Start(); 
2

Zakładając, że chcesz po prostu uruchomić pliki, które mają już pewne związane z nimi aplikacje (np: * .txt jest związana z notatnika), Użyj System.Diagnostics.Process.

np. :

using System.Diagnostics; 
    Process p = new Process(); 
    ProcessStartInfo pi = new ProcessStartInfo(); 
    pi.UseShellExecute = true; 
    pi.FileName = @"MY_FILE_WITH_FULL_PATH.jpg"; 
    p.StartInfo = pi; 

    try 
    { 
     p.Start(); 
    } 
    catch (Exception Ex) 
    { 
     //MessageBox.Show(Ex.Message); 
    } 

Uwaga: W moim komputerze, pic otwiera się w systemie Windows Picture & Fax Viewer ponieważ jest domyślną aplikacją dla plików * .jpg.