2016-07-13 8 views
0

Jemand sagte mir, dass wenn Sie auf der Google 3. Seite bei all Ihren Suchanfragen landen, es fast unmöglich ist, aber das sollte sehr einfach sein .
Ich erhalte eine Byte-Array von WCF und ich möchte es in eine TXT-Datei konvertieren. Die Sache ist, dass ich sie mit einem Knopf in WPF öffnen möchte, ohne eine Kopie dieser Datei auf der clientseitigen Festplatte zu schreiben. Wenn es notwendig ist, kann der Benutzer es lokal direkt vom Notizblock speichern.
Alle Dateien sind sehr klein (bis zu 100kb), daher sollte RAM nicht betroffen sein.
Vielen Dank für Ihre Antworten! Ich werde das Ergebnis hier posten, falls jemand es in der Zukunft braucht!
_______________________________________________________________________________
eine neue Klasse erstellen: NotePadHelper (einschließlich System.Runtime.InteropServices;)WPF Erstellen Sie eine TXT-Datei aus einem Byte-Array im Speicher und öffnen Sie es mit dem Editor

public class NotePadHelper 
{ 
    [DllImport("user32.dll", EntryPoint = "SetWindowText")] 
    private static extern int SetWindowText(IntPtr hWnd, string text); 

    [DllImport("user32.dll", EntryPoint = "FindWindowEx")] 
    private static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow); 

    [DllImport("User32.dll", EntryPoint = "SendMessage")] 
    private static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, string lParam); 

    public static void ShowMessage(string message = null, string title = null) 
    { 
     Process notepad = Process.Start(new ProcessStartInfo("notepad.exe")); 
     if (notepad != null) 
     { 
      notepad.WaitForInputIdle(); 

      if (!string.IsNullOrEmpty(title)) 
       SetWindowText(notepad.MainWindowHandle, title); 

      if (!string.IsNullOrEmpty(message)) 
      { 
       IntPtr child = FindWindowEx(notepad.MainWindowHandle, new IntPtr(0), "Edit", null); 
       SendMessage(child, 0x000C, 0, message); 
      } 
     } 
    } 
} 

Jetzt müssen Sie auf Zeichenfolge, die die Byte-Array umwandeln und die Doc in Notepad zeigen

var str = System.Text.Encoding.Default.GetString(docObject.Image); 
       NotePadHelper.ShowMessage(str, docObject.Name); 

Danke @keyboardP und @PInvoke!

+1

Versuchen Sie, die PInvoke Antwort mit [hier] (http://stackoverflow.com/a/14295249/187697), ich glaube, das ist, was Sie für – keyboardP

+0

fordern Sie danken. Ich muss daran arbeiten, denn diese Funktion nimmt die Nachricht als String und nicht als Byte-Array. –

+0

Werfen Sie einen Blick auf 'MemoryMappedFile' –

Antwort

0

Dies kann wirklich getan werden. Es ist nur ein bisschen Arbeit. Zuerst müssen Sie eine Zeichenfolge von Ihrem byte[] erhalten. Das ist ganz einfach:

string text = System.Text.Encoding.UTF8.GetString(byteArray); 

Alles was Sie jetzt tun müssen, ist Notepad zu öffnen und diesen Text, um es zu schreiben ...

Was viele gemeinsame Programme eine lokale Kopie geschieht in im Hintergrund erstellt um mögliche Datenverluste zu verhindern.

Ich würde vorschlagen das gleiche tun. Schreiben Sie einfach in eine Datei (in temp dir), speichern Sie den Pfad und öffnen Sie ihn.

//To Save to a file: 
string tempPath = Path.Combine(Path.GetTempPath(), fileName); 
File.WriteAllText(tempPath, text); 
//Now open the file you just created: 
Process.Start(tempPath); 

Wenn der Benutzer es auf einem anderen Pfad speichert, können Sie die temporäre Datei löschen.

Wenn Sie wollen das Ding versuchen, mit in Notizblock zu schreiben hier ein Link, wo zu erhalten, so Details:

Open Notepad and add Text not working

Ich mag nicht mit Griffen arbeiten und andere Fenster zu manipulieren, aber fühlen Sie sich frei, es zu ein Versuch.

hoffe, das hilft

+0

Nur eine Randnotiz, das OP wird die Codierung verwenden müssen, die ursprünglich verwendet wurde, um die Quellzeichenfolge in ein Bytearray zu codieren (Sie haben UTF8 angenommen, das möglicherweise nicht richtig ist). – Kevin

+0

OP hat ursprünglich "ohne das Schreiben einer Kopie dieser Datei auf der clientseitigen Festplatte" angegeben. Obwohl Sie nur eine temporäre Datei verwenden, erfüllen Sie diese Anforderung nicht. –

+0

Ich habe gerade einige zusätzliche Möglichkeiten erwähnt, dies zu tun? Ich gab auch eine Anleitung, wie man es ohne eine lokale/temporäre Kopie machen kann. –