2012-12-07 7 views
8

Da C#, voglio avviare un processo che apre un file di testo in qualsiasi editor e sposta automaticamente il cursore su un determinato numero di riga.Come avviare un processo che apre un file di testo in qualsiasi editor e sposta automaticamente il cursore su un determinato numero di riga?

posso aprire un file utilizzando

Process.Start(@"c:\myfile.txt"); 

ma io non so come per spostare il cursore nella posizione specifica in quel file.


risposta con il codice sorgente:

sì, ho usato Notepad ++

private void openLog() { 
      try { 
       // see if notepad++ is installed on user's machine 
       var nppDir = (string)Registry.GetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\Notepad++", null, null); 
       if (nppDir != null) { 
        var nppExePath = Path.Combine(nppDir, "Notepad++.exe"); 
        var nppReadmePath = Path.Combine(yourDirectory,fileName); 
        var line = 20; 
        var sb = new StringBuilder(); 
        sb.AppendFormat("\"{0}\" -n{1}", nppReadmePath, lineNo); 
        Process.Start(nppExePath, sb.ToString()); 
       } else { 
        string newPath = @"\\mySharedDrive\notpad++\bin\notepad++.exe"; 
        Process.Start(newPath, @"\\" + filePath + " -n" + lineNo); // take exe from my shared drive 
       } 
      } catch (Exception e) { 
       Process.Start(@"\\" + FilePath); // open using notepad 
      } 
     } 
+2

L'unico modo in cui penso che questo sia possibile è con l'automazione a livello di input del driver della tastiera, facendo presupporre che l'editor scenda di una riga per ogni freccia verso il basso premuta. Puoi dare un'occhiata a http://www.autohotkey.com/ per che il blocco note –

+1

ha la funzione "vai alla riga" finché il ritorno a capo automatico è disabilitato. Ciò richiederà ancora l'invio dell'input da tastiera per l'elaborazione, il che fa schifo. Se stai usando Notepad ++, consulta http://superuser.com/questions/290409/opening-a-text-file-at-a-certain-line-shortcut. Notepad ++ sembra avere un arg di linea di comando che lo aprirà su una linea specifica. –

+0

qualsiasi soluzione finale con codice sorgente completo? Forse anche usando Notepad ++ e UltraEdit. – Kiquenet

risposta

10

Get Notepad ++, allora si può fare questo:

var nppDir = (string)Registry.GetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\Notepad++", null, null); 
    var nppExePath = Path.Combine(nppDir, "Notepad++.exe"); 
    var nppReadmePath = Path.Combine(nppDir, "readme.txt"); 
    var line = 20; 
    var sb = new StringBuilder(); 
    sb.AppendFormat("\"{0}\" -n{1}", nppReadmePath, line); 
    Process.Start(nppExePath, sb.ToString()); 

In questo esempio si ottiene percorso di installazione di n ++ dal Registro di sistema, costruire il percorso a exe e file readme.txt, apre un proprio file readme.txt con il cursore sulla riga 20. L'uso di StringBuilder è più efficiente dell'uso di più appendi (spiegazione da qualche parte su SO).

+0

ottimo, funziona grazie mille. a proposito, dal momento che tu lo sapevi, immagino che tu sapresti anche un modo per trovare "notepad ++.exe "posizione dinamicamente e rapidamente? –

+0

Se è stato installato utilizzando il programma di installazione è possibile ottenere dal Registro di sistema: var path = Registry.GetValue (" HKEY_LOCAL_MACHINE \\ SOFTWARE \\ Notepad ++ ", null, null); –

2

La soluzione dipende fortemente su cui si apre processo/editore sul sistema. Quell'editor dovrebbe avere un'API per sviluppatori che potresti utilizzare per accedere a funzionalità quali l'impostazione di intervalli e la modifica della posizione del cursore. Ad esempio, se l'editor che viene aperto è Microsoft Word, si utilizzerà lo Word Interop API per impostare una selezione in una posizione specifica. Non esiste un modo universale per farlo in "qualsiasi editor" poiché ognuno ha la propria API (o nessuna API rivolta verso l'esterno).

+0

sì, chiedere "qualsiasi" probabilmente richiede la magia. Grazie per l'API di Word Interop. Farò un tentativo. Dal momento che mi baso molto sulla linea n. Dubito che l'apertura del file con MSWord funzionerà. –

1

Forse stai andando nel modo sbagliato. Non sono sicuro di ciò che stai cercando di realizzare, ma penso che sarebbe molto più semplice aprire il file di testo in un editor che appartiene a alla tua applicazione. Forse un altro modulo con un controllo editor WYSIWYG. In questo modo hai il pieno controllo su dove il cursore si posizionerà in quell'editor. Altrimenti, ci sono troppe cose sconosciute per qualsiasi cosa fattibile in modo fattibile.

+0

Sto semplicemente scrivendo un piccolo strumento per la ricerca di parole chiave che può cercare dai registri attraverso tutti i server di rete e, su richiesta dell'utente, voglio aprire il file di log @specific line no. Non sono sicuro di rendere quei registri di grandi dimensioni in un controllo incorporato con l'applicazione sottile. È elegante? –

+1

Poiché i registri sono (di solito) di sola lettura, è possibile estrarre solo le righe pertinenti (e le linee circostanti X) e visualizzarle localmente nell'applicazione. Aprire un editor di testo suona come eccessivo. –

Problemi correlati