2012-04-16 19 views
39

Chcę poprosić o pomoc przy otwieraniu pliku z aplikacji C# z powiązaną aplikacją. Próbowałem to:Otwórz plik z powiązaną aplikacją

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

lub to:

 Process.Start(file); 

gdzie ciąg file w obu przykładach reprezentuje pełną ścieżkę dostępu do pliku próbuje otworzyć. Teraz wszystko działa dobrze, z wyjątkiem obrazów (jpg) z aplikacją ACDSee. Stowarzyszenia Irfanview działają dobrze, dokumenty MS Office też. Po próbie otwarcia obrazu jpg związanego z acdsee po prostu uruchamia acdsee w obszarze powiadomień i nie otwiera pliku.

odkryłem, że w rejestrze CLASSES_ROOT dla obrazów * .jpg, nie jest wartością ACDSee.JPG jako powiązanej aplikacji, a w tym kluczu jest w shell-> typu otwarty> Komenda ścieżkę :

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

i rzeczą, która to dziwne /dde jest powód, dlaczego nie mogę otworzyć pliku. Zdałem sobie sprawę, że w tym samym reg klucz shell-> Otwórz jest jakaś DDEExec key o wartości [open("%1")]

Do widzenia Irfan lub innej sprawdzonej aplikacji nie jest ddeexec, tylko normalna komenda jak

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

, które mogą być uruchamiane z linii poleceń po swaping% 1 do nazwy pliku , ale nie mogę uruchomić polecenie z wejściem ACDSee w wierszu poleceń :(

Więc moje pytanie brzmi: w jaki sposób można skonfigurować ProcessStartInfo obiekt do upewnij się, że będzie uruchamiał wszystkie pliki, tak jak byłoby w eksploratorze przez doubleclick, standardy i te DDEExec te? Czy jest coś takiego, jak DDEExec, o którym powinienem wiedzieć? dzięki i przepraszam za mój EN

Odpowiedz

79

Wystarczy napisać

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

przykład

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

i Shell będzie przebieg programu wiąże się czytając go z rejestru, jak zwykle robi podwójne kliknięcie.

+2

Wygląda na to, że próbował już tego z 'Process.Start (file);'. –

+0

"Więc moje pytanie, jak mogę ustawić obiekt ProcessStartInfo, aby upewnić się, że uruchomi wszystkie pliki tak, jak byłoby to w eksploratorze przez doubleclick": odpowiedź jest taka. Używał argumentów linii poleceń, cokolwiek ... ale nie bezpośredniego wywoływania, tyle ile widzę. – Tigran

+0

@ Tigran Mario ma rację, jak napisałem Próbowałem twojej sugestii jako drugiego przykładu ... chciałem zadać moje pytanie w sposób, który wyraźnie nie jest odpowiednim rozwiązaniem, ponieważ jpg nie jest otwarte! – Zavael

9

To jest stara nitka, ale na wszelki wypadek, gdy ktoś ją obejrzy tak jak ja. pi.FileName należy ustawić na nazwę pliku (i ewentualnie pełną ścieżkę do pliku) pliku wykonywalnego, którego chcesz użyć do otwarcia pliku. Poniższy kod działa dla mnie, aby otworzyć plik wideo z VLC.

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

prace odpowiedź Tigran, ale użyje domyślnej aplikacji Windows', aby otworzyć plik, więc korzystanie ProcessStartInfo może być przydatna, jeśli chcesz, aby otworzyć plik z aplikacji, która nie jest domyślnie.

+3

(: komentarz do starej odpowiedzi na stary wątek :) Odpowiedź Tigrana uruchamia ostatnio skojarzony program dla rozszerzeń każdego pliku. Odpowiedź drzewa wymusza użycie ** vlc .exe ** Pytanie zadane przez Zavaela dotyczy problemów, z jakimi on _ tylko ma do czynienia z ** ACDSee.exe ** i jak ustawia swoje powiązanie rozszerzeń.Myślę, że autorzy ACDSee muszą się z tym skontaktować. –