C# WPF RichTextBox: Wie komm ich an den formatierten Text?

Ich habe alle umgestellt. Trotzdem erhalte ich diesen Fehler.

PS: Unter Forms war es so schön einfach. Einfach richTextBox1.Rtf und gut war. Warum hat man das nicht behalten. Allein schon die Tatsache, dass man mit Dependency Properties arbeiten muss finde ich etwas nervig. Aber wenn man es erstmal verstanden hat, ist es ok. :D
 
versuch's mal hiermit. hab's eben probiert (hätte ich mich an der diskussion mal besser erst gar net beteiligt :D). natürlich noch nach belieben abändern :)


Code:
namespace WpfApplication1
{
    using System;
    using System.IO;
    using System.Security.Cryptography;
    using System.Text;
    using System.Windows.Documents;
    using System.Windows.Markup;

    public class FlowDocEncryptor : IDisposable
    {
        private bool _disposed;
        private readonly SHA256 _sha256;
        private readonly Rijndael _rijndael;
        
        public FlowDocEncryptor( string key )
        {
            _sha256 = SHA256.Create();
            _rijndael = Rijndael.Create();
            _rijndael.BlockSize = 256;

            /* abändern!! */
            _rijndael.IV = _sha256.ComputeHash( Encoding.Unicode.GetBytes( key ) );
            _rijndael.Key = _sha256.ComputeHash( _rijndael.IV );
        }

        public void EncryptToFile( string path, FlowDocument flowDoc )
        {
            if ( File.Exists( path ) )
            {
                try { File.Delete( path ); }
                catch ( Exception ) { /* error handling */ }
            }

            FileStream fstream = null;
            CryptoStream cstream = null;
            try
            {
                fstream = File.Open( path, FileMode.CreateNew, FileAccess.Write );
                cstream = new CryptoStream( fstream, _rijndael.CreateEncryptor( _rijndael.Key, _rijndael.IV ), CryptoStreamMode.Write );
                string xaml = XamlWriter.Save( flowDoc );
                byte[] data = Encoding.Unicode.GetBytes( xaml );
                cstream.Write( data, 0, data.Length );
                cstream.Flush();
                fstream.Flush();
            }
            catch ( Exception )
            {
                /* suppress any, todo */
            }
            finally
            {
                if ( cstream != null )
                {
                    cstream.Close();
                    cstream.Dispose();
                }

                if (fstream != null)
                {
                    fstream.Close();
                    fstream.Dispose();
                }
            }
        }

        public FlowDocument DecryptFromFile( string path )
        {
            if ( !File.Exists( path ) )
                throw new FileNotFoundException();
            
            CryptoStream cstream = null;
            MemoryStream mstream = null;
            StreamReader reader = null;

            try
            {
                byte[] data = File.ReadAllBytes( path );
                mstream = new MemoryStream( data, true );
                cstream = new CryptoStream( mstream, _rijndael.CreateDecryptor( _rijndael.Key, _rijndael.IV ), CryptoStreamMode.Read );
                reader = new StreamReader( cstream, Encoding.Unicode );
                
                return XamlReader.Parse( reader.ReadToEnd() ) as FlowDocument;
            }
            catch ( Exception )
            {
                /* suppress any, todo */
                return new FlowDocument();
            }
            finally
            {
                if ( cstream != null )
                {
                    cstream.Close();
                    cstream.Dispose();
                }

                if ( mstream != null )
                {
                    mstream.Close();
                    mstream.Dispose();
                }

                if ( reader != null )
                {
                    reader.Close();
                    reader.Dispose();
                }
            }
        }

        public void Dispose()
        {
            if ( _disposed ) return;

            _rijndael.Clear();
            _rijndael.Dispose();

            _sha256.Clear();
            _sha256.Dispose();

            _disposed = true;
        }
    }
}

usage:

Code:
namespace WpfApplication1
{
    using System.Windows;
    using System.Windows.Documents;

    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow
    {
        private FlowDocEncryptor _docEncryptor;

        public MainWindow()
        {
            InitializeComponent();
            _docEncryptor = new FlowDocEncryptor( "testing" );
        }

        private void OnSave( object sender, RoutedEventArgs e )
        {
            _docEncryptor.EncryptToFile( @"D:\test.txt", richTextBox1.Document );
            richTextBox1.Document = new FlowDocument();
        }

        private void OnLoad( object sender, RoutedEventArgs e )
        {
            richTextBox1.Document = _docEncryptor.DecryptFromFile( @"D:\test.txt" );
        }
    }
}


PS.
Komm jetzt nicht an und sag es geht wieder nicht. Dann stimmt bei dir irgendwas nicht :)
 
Zuletzt bearbeitet:
Vielen vielen Dank. Es geht.... :D

Hast du das selbstgeschrieben? Wozu schreibt man diese Unterstriche("_") eigentlich vor solche Methoden?
 
Ja hab das "eben" geschrieben, da ich selbst schon am verzweifeln war, wieso der Code bei dir nie klappte :)

Die Unterstriche sind ne weitläufige Konvention um anzuzeigen, dass die Variable (nicht Methode) als private deklariert wurde. Manche schreiben _name, andere m_name, und die, die zu viel Zeit haben this.name :D
 
Danke, dass du dir die Müße gemacht hast. :)

Zu den Unterstrichen: Das habe ich mich nämlich schon immer gefragt, was man nun am besten nimmt. Aber es scheint ja egal zu sein, oder? :)
 
Gerne ;)

Naja, ganz egal ist es nicht, zumindest nicht, wenn du nicht der einzige bist, der sich deinen Code anschaut. Ansonsten nimm das, was dir am ehesten zusagt. Versuch aber nicht so einen Mix aus allem zu schreiben ;)

Google einfach nach 'c# naming convention'. Da gibt es etliche Artikel, Meinung, Diskussionen und Streitigkeiten drüber :D
 
Hallo, ich bins nochmal ;), und habe noch ein Problem. Ich habe deine Klasse nun so umgeändert, dass ich (eigendlich) Dateien mit in die Ausgabedatei schreiben kann:
Code:
public class FlowDocEncryptor : IDisposable
    {
        private bool _disposed;
        private readonly SHA256 _sha256;
        private readonly Rijndael _rijndael;

        public FlowDocEncryptor(string key)
        {
            _sha256 = SHA256.Create();
            _rijndael = Rijndael.Create();
            _rijndael.BlockSize = 256;
            _rijndael.IV = ***;
            _rijndael.Key = ***;
        }
        public void EncryptToFile(string path, FlowDocument flowDoc, List<string> files, List<string> filenames)
        {
            if (File.Exists(path))
            {
                try { File.Delete(path); }
                catch (Exception) { /* error handling */ }
            }

            FileStream fstream = null;
            CryptoStream cstream = null;
            try
            {
                fstream = File.Open(path, FileMode.CreateNew, FileAccess.Write);
                cstream = new CryptoStream(fstream, _rijndael.CreateEncryptor(_rijndael.Key, _rijndael.IV), CryptoStreamMode.Write);
                string gesamt = "";
                string xaml = XamlWriter.Save(flowDoc);
                string trenn = "+*+++~##EEAD by Chriss000xx.sssd";
                gesamt = xaml + trenn;
                for (int i = 0; i < files.Count; i++)
                {
                    gesamt = gesamt + "-#+++:"+Encoding.Unicode.GetString(File.ReadAllBytes(files[i]))+"filename::++"+filenames[i];
                }
                byte[] data = Encoding.Unicode.GetBytes(gesamt);
                cstream.Write(data, 0, data.Length);
                cstream.Flush();
                fstream.Flush();
            }
            catch (Exception)
            {
                
            }
            finally
            {
                try
                {
                    if (cstream != null)
                    {
                        cstream.Close();
                        cstream.Dispose();
                    }

                    if (fstream != null)
                    {
                        fstream.Close();
                        fstream.Dispose();
                    }
                }
                catch { }
            }
        }
        bool timer = false;
        int wait = 5;
        Button button;
        private void timer1_Tick(object sender, EventArgs e)
        {
            if (timer == true)
            {
                button.IsEnabled = false;
                button.Width = 859;
                button.Content = "Passwort falsch! Noch " + wait + " Sekunden warten";
                if (wait == 0)
                {
                    timer = false;
                    wait = 5;
                    button.IsEnabled = true;
                    button.Content = "Container wählen";
                    button.Width = 100;
                }
                wait--;
            }
        }
        List<string> filenames = new List<string>();
        List<byte[]> filedata = new List<byte[]>();

        public List<string> names()
        {
            return filenames;
        }
        public List<byte[]> data()
        {
            return filedata;
        }

        public FlowDocument DecryptFromFile(string path, Button error)
        {
            System.Windows.Forms.Timer time = new System.Windows.Forms.Timer();
            time.Interval = 1000;
            time.Tick += new System.EventHandler(this.timer1_Tick);
            button = error;
            time.Start();
            if (!File.Exists(path))
                throw new FileNotFoundException();

            CryptoStream cstream = null;
            MemoryStream mstream = null;
            StreamReader reader = null;

            try
            {
                byte[] data = File.ReadAllBytes(path);
                mstream = new MemoryStream(data, true);
                cstream = new CryptoStream(mstream, _rijndael.CreateDecryptor(_rijndael.Key, _rijndael.IV), CryptoStreamMode.Read);
                reader = new StreamReader(cstream, Encoding.Unicode);
                string gesamt = reader.ReadToEnd();
                string[] trenn = new string[1]{"+*+++~##EEAD by Chriss000xx.sssd"};
                string[] trenn2 = new string[1] { "-#+++:" };
                string[] trenn3 = new string[1] { "filename::++" };
                string xaml = gesamt.Split(trenn,StringSplitOptions.None)[0];
                try
                {
                    string rest = gesamt.Split(trenn, StringSplitOptions.None)[1];
                    try
                    {
                        for (int i = 0; i < rest.Split(trenn2, StringSplitOptions.RemoveEmptyEntries).Length; i++)
                        {
                            filedata.Add(Encoding.Unicode.GetBytes(rest.Split(trenn2, StringSplitOptions.None)[i].Split(trenn3, StringSplitOptions.None)[0]));
                            filenames.Add(rest.Split(trenn2, StringSplitOptions.None)[i].Split(trenn3, StringSplitOptions.None)[1]);
                        }
                    }
                    catch { }
                }
                catch (Exception e)
                {
                    filenames.Add(e.Message);
                    filedata.Add(new byte[1]{0});
                    string rest = gesamt.Split(trenn, StringSplitOptions.None)[1];
                    filenames.Add(rest.Split(trenn2, StringSplitOptions.RemoveEmptyEntries).Length.ToString());
                    filedata.Add(new byte[1] { 0 });
                }
                return XamlReader.Parse(xaml) as FlowDocument;
            }
            catch (Exception)
            {
                return new FlowDocument();
            }
            finally
            {
                try
                {
                    if (cstream != null)
                    {
                        cstream.Close();
                        cstream.Dispose();
                    }

                    if (mstream != null)
                    {
                        mstream.Close();
                        mstream.Dispose();
                    }

                    if (reader != null)
                    {
                        reader.Close();
                        reader.Dispose();
                    }
                }
                catch
                {
                    timer = true;
                    button.IsEnabled = false;
                    button.Width = 859;
                    button.Content = "Passwort falsch! Noch " + wait + " Sekunden warten";
                }
            }

        }
        public static byte[] keyhash(string key)
        {
            MD5 md5 = MD5.Create();
            SHA256 sha = SHA256.Create();
            byte[] data = ***;
            return data;
        }
        public static byte[] ivhash(string key)
        {
            MD5 md5 = MD5.Create();
            SHA256 sha = SHA256.Create();
            byte[] data = ***;
            return data;
        }
        public void Dispose()
        {
            if (_disposed) return;

            _rijndael.Clear();
            _rijndael.Dispose();

            _sha256.Clear();
            _sha256.Dispose();

            _disposed = true;
        }
    }

Meine Encrypt bzw. Decrypt Methoden siehen nun so aus:
Code:
        public void Encrypt(string path, string Key)
        {
            FlowDocEncryptor Flow = new FlowDocEncryptor(Key);
            Flow.EncryptToFile(path, richTextBox1.Document, dateien, dnamen);
        }

        public void Decrypt(string path, string Key)
        {
            FlowDocEncryptor Flow = new FlowDocEncryptor(Key);
            richTextBox1.Document = Flow.DecryptFromFile(path,button1);
            System.Windows.Forms.Application.DoEvents();
            dnamen = Flow.names();
            ddata = Flow.data();

            foreach (string file in dnamen)
            {
                Label lab = new Label();
                lab.Name = "Datei" + dateiencount;
                lab.FontFamily = new FontFamily("Segoe UI");
                lab.FontSize = 14;
                lab.Foreground = new SolidColorBrush(Colors.Gray);
                lab.Content = System.IO.Path.GetFileName(file);
                lab.VerticalAlignment = System.Windows.VerticalAlignment.Center;
                listBox1.Items.Add(lab);
                if (dateiencount == 0)
                {
                    expander1.Header = System.IO.Path.GetFileName(file);
                }
                else
                {
                    expander1.Header = System.IO.Path.GetFileName(file) + " (und " + (dateiencount) + " Andere)";
                }
                dateiencount++;
                if (firstdateicount == 0)
                {
                    listBox1.Items.RemoveAt(0);
                    firstdateicount = 1;
                }
            }
        }

Eigentlich müsste er den "gesamt" String nun so auseinander spalten, dass er in meiner ListBox erscheint. Dies tut er aber nicht. Es erscheint zwar der Text. Jedoch nicht die Dateien. Ich weiß leider nicht warum. Hab schon alles mögliche ausprobiert, jedoch hat es nicht funktioniert:(.
Ich hoffe du hast eine Lösung für mich. :)

EDIT: Ich habs gelöst. :D
 
Zuletzt bearbeitet:
Ein Anliegen, dass mir eben aufgefallen ist habe ich aber noch. Sobald ich eine große Dateimenge erreicht habe, funktioniert das Schreiben der Datei nicht mehr. Die Datei ist dann nur 32 Bytes groß. Mit relativ kleinen Datenmengen (ca. 60MB) funktioniert es tadellos. Erst wenn ich z.B. 12 Photoshop Dateien mit jeweils ca. 3-4MB anfüge, funktioniert es nicht mehr.:(

Gibt es irgendeine Begrenzung, die ich überschreite? z.B. die Maximale Größe eines Strings, MemoryStreams, FileStreams, oder Cryptostreams?

Danke schon mal im Voraus.
 
nabend,

Ich vermute, dass der fehler hier liegen könnte:
Code:
gesamt = gesamt + "-#+++:"+Encoding.Unicode.GetString(File.ReadAllBytes(files[i]))+"filename::++"+filenames[i];

Der Grund ist, dass bei Verwendung von += jedes mal ein neuer String erzeugt wird und somit Speicher verbraucht. Um dem vorzubeugen, sollte man am besten die klasse StringBuilder verwenden.

Code:
StringBuilder sb = new StringBuilder();
sb.append(DeinString);

Probier es mal aus, vielleicht hilft es Dein Problem zu lösen :)
 
Werd ich gleich versuchen. ;) Danke. :)

EDIT:
Mittlerweile sieht es schon so aus:
Code:
FileStream fstream = null;
            CryptoStream cstream = null;
            try
            {
                fstream = File.Open(path, FileMode.Create, FileAccess.Write);
                cstream = new CryptoStream(fstream, _rijndael.CreateEncryptor(_rijndael.Key, _rijndael.IV), CryptoStreamMode.Write);
                string gesamt = "";
                string xaml = XamlWriter.Save(flowDoc);
                string trenn = "+*+++~##EEAD by Chriss000xx.sssd";
                gesamt = xaml + trenn;
                byte[] data = Encoding.GetEncoding(28591).GetBytes(gesamt);
                for (int i = 0; i < files.Count; i++)
                {
                    data = Encoding.GetEncoding(28591).GetBytes(Encoding.GetEncoding(28591).GetString(data)+"-#+++:" + Encoding.GetEncoding(28591).GetString(File.ReadAllBytes(files[i])) + "filename::++" + filenames[i]);
                }

                int len = data.Length;
                int dur = 0;
                int cou = 1000;
                while (len != 0)
                {
                    if (data.Length - dur < 1000)
                    {
                        cou = data.Length - dur;
                    }
                    cstream.Write(data, dur, cou);
                    dur = dur + cou;
                    len = len - cou;
                    pr.Value = Convert.ToDouble(Math.Round(Convert.ToDecimal(Convert.ToDecimal(dur) / Convert.ToDecimal(data.Length) * Convert.ToDecimal(100))));
                    block.Text = Math.Round(Convert.ToDecimal(Convert.ToDecimal(dur) / Convert.ToDecimal(data.Length) * Convert.ToDecimal(100))) + "%  " + "(" + dur + " von " + data.Length + " Bytes) verschlüsselt";
                    block.UpdateLayout();
                    System.Windows.Forms.Application.DoEvents();
                }
                cstream.Flush();
                fstream.Flush();
            }
            catch (Exception)
            {
                
            }
            finally
            {
                try
                {
                    if (cstream != null)
                    {
                        cstream.Close();
                        cstream.Dispose();
                    }

                    if (fstream != null)
                    {
                        fstream.Close();
                        fstream.Dispose();
                    }
                }
                catch { }
            }
D.h. kann es doch zu deinem oben genannten Problem nicht mehr kommen, oder?
 
Zuletzt bearbeitet:
In dem Fall nicht, nein. Funktioniert das Speichern immer noch nicht? Was mich nur ein wenig wunder ist - vielleicht ist es aber auch schon zu spät für mich ;)

Code:
byte[] data = Encoding.GetEncoding(28591).GetBytes(gesamt);
for (int i = 0; i < files.Count; i++)
{
      data = Encoding.GetEncoding(28591).GetBytes(Encoding.GetEncoding(28591).GetString(data)+"-#+++:" + Encoding.GetEncoding(28591).GetString(File.ReadAllBytes(files[i])) + "filename::++" + filenames[i]);
}

Du definierst dir einen Byte Array, überschreibst ihn aber mit jedem Schleifendurchlauf. D.h. du hast am Ende nur in dem Byte Array den Inhalt des letzten Schleifendurchlaufes.
 
Fällt mir auch gerad so auf. :D Aber mit kleineren Dateimengen funktionierts ja auch. Egal wie viele Dateien. Solange es eben nicht über 60-100MB (Hab ich nicht genau ausgelotet) kommt.
komisch.... Vlt. fällt dir ja morgen ein Lösungsvorschlag ein.:)
 
Du hast die Klasse ganz schön verhunzt :D
Ich beschäftige mich später mal damit.

Für den Augenblick:

Setz mal bitte einen Breakpoint auf den Catch-Block oder lass die Exception irgendwo ausgeben. Was du imo tust ist einfach jeden Fehler stillschweigend zu unterdrücken.
 
Ok mach ich. ;)Das "verhunzen" der Klasse war leider nötig, damit ich auch Dateien hinzufügen kann. :)

EDIT: Als Fehler wird mir das ausgegeben:
Eine Ausnahme vom Typ "System.OutOfMemoryException" wurde ausgelöst.
 
Zuletzt bearbeitet:
Warum schreibst du die Daten nicht direkt in den Stream anstatt lange Strings zusammen zu bauen?
 
Also das Verschlüsseln klappt jetzt:
Code:
FileStream fstream = null;
            CryptoStream cstream = null;
            try
            {
                fstream = File.Open(path, FileMode.Create, FileAccess.Write);
                cstream = new CryptoStream(fstream, _rijndael.CreateEncryptor(_rijndael.Key, _rijndael.IV), CryptoStreamMode.Write);
                string gesamt = "";
                string xaml = XamlWriter.Save(flowDoc);
                string trenn = "+*+++~##EEAD by Chriss000xx.sssd";
                gesamt = xaml + trenn;
                byte[] data = Encoding.GetEncoding(28591).GetBytes(gesamt);
                cstream.Write(data, 0, data.Length);
                for (int i = 0; i < files.Count; i++)
                {
                    data = Encoding.GetEncoding(28591).GetBytes("-#+++:" + Encoding.GetEncoding(28591).GetString(File.ReadAllBytes(files[i])) + "filename::++" + filenames[i]);
                    int len = data.Length;
                    int dur = 0;
                    int cou = 10000;
                    while (len != 0)
                    {
                        if (data.Length - dur < 10000)
                        {
                            cou = data.Length - dur;
                        }
                        cstream.Write(data, dur, cou);
                        dur = dur + cou;
                        len = len - cou;
                        pr.Value = Convert.ToDouble(Math.Round(Convert.ToDecimal(Convert.ToDecimal(dur) / Convert.ToDecimal(data.Length) * Convert.ToDecimal(100))));
                        block.Text = Environment.NewLine + "Datei: " + filenames[i] + Environment.NewLine + Math.Round(Convert.ToDecimal(Convert.ToDecimal(dur) / Convert.ToDecimal(data.Length) * Convert.ToDecimal(100))) + "%  " + "(" + Math.Round((decimal)(dur / 1024)) + " von " + Math.Round((decimal)(data.Length / 1024)) + " Kilobytes) verschlüsselt";
                        block.UpdateLayout();
                        System.Windows.Forms.Application.DoEvents();
                    }
                }

                
                cstream.Flush();
                fstream.Flush();

Nun hab ich jedoch Probleme mit dem Entschlüsseln:
Code:
int gesl = File.ReadAllBytes(path).Length;
            int len = File.ReadAllBytes(path).Length;
            System.Windows.Forms.Timer time = new System.Windows.Forms.Timer();
            time.Interval = 1000;
            time.Tick += new System.EventHandler(this.timer1_Tick);
            button = error;
            time.Start();
            if (!File.Exists(path))
                throw new FileNotFoundException();

            CryptoStream cstream = null;
            MemoryStream mstream = null;
            StreamReader reader = null;

            try
            {
                FileStream file = new FileStream(path, FileMode.Open);

                cstream = new CryptoStream(file, _rijndael.CreateDecryptor(_rijndael.Key, _rijndael.IV), CryptoStreamMode.Read);
                reader = new StreamReader(cstream, Encoding.GetEncoding(28591));


                string gesamt = "";


                    int dur = 0;
                    int cou = 1000000;
                    while (len != 0)
                    {
                        char[] tmp = new char[1000000];
                        if (gesl - dur < 1000000)
                        {
                            cou = gesl- dur;
                        }
                        reader.ReadBlock(tmp, 0, cou);
                        dur = dur + cou;
                        len = len - cou;
                        File.AppendAllText("LOG3.txt", "LEN = "+len.ToString()+Environment.NewLine);
                        File.AppendAllText("LOG3.txt", "DUR = " + dur.ToString() + Environment.NewLine);
                        File.AppendAllText("LOG3.txt", "COU = " + cou.ToString() + Environment.NewLine);
                        gesamt = gesamt + new string(tmp);

                    }
                    reader.Close();

                string[] trenn = new string[1]{"+*+++~##EEAD by Chriss000xx.sssd"};
                string[] trenn2 = new string[1] { "-#+++:" };
                string[] trenn3 = new string[1] { "filename::++" };
                string xaml = gesamt.Split(trenn,StringSplitOptions.None)[0];
                try
                {
                    string rest = gesamt.Split(trenn, StringSplitOptions.None)[1];
                    try
                    {
                        for (int i = 0; i < rest.Split(trenn2, StringSplitOptions.RemoveEmptyEntries).Length; i++)
                        {
                            filedata.Add(Encoding.GetEncoding(28591).GetBytes(rest.Split(trenn2, StringSplitOptions.None)[i+1].Split(trenn3, StringSplitOptions.None)[0]));
                            filenames.Add(rest.Split(trenn2, StringSplitOptions.None)[i+1].Split(trenn3, StringSplitOptions.None)[1]);
                        }
                    }
                    catch { }
                }
                catch
                {

                }
                pr.IsIndeterminate = true;
                return XamlReader.Parse(xaml) as FlowDocument;
            }
            catch (Exception e)
            {
                File.WriteAllText("LOG.txt", e.Message);
                return new FlowDocument();
            }
            finally
            {
                try
                {
                    if (cstream != null)
                    {
                        cstream.Close();
                        cstream.Dispose();
                    }

                    if (mstream != null)
                    {
                        mstream.Close();
                        mstream.Dispose();
                    }

                    if (reader != null)
                    {
                        reader.Close();
                        reader.Dispose();
                    }
                }
                catch(Exception e)
                {
                    timer = true;
                    button.IsEnabled = false;
                    button.Width = 859;
                    button.Content = "Passwort falsch! Noch " + wait + " Sekunden warten";
                }
            }

Ich vermute, dass es das gleiche Problem ist, dass der String zu groß wird. Nun steh ich jedoch vor dem Problem, dass ich den String ja erst auswerten kann, wenn er komplett entschlüsselt ist.:(
Wie könnte ich das Problem lösen?:) Ich habe schon an einen String[] gedacht, in dem jeder String immer so 1000000 Zeichen groß ist, jedoch weiß ich nicht wie ich das realisieren soll. :(
 
Anstatt
string gesamt = "";
probiere mal
StringBuilder gesamt = new StringBuilder();
...
gesamt.Append(tmp);

Initialisiere die Variable tmp vor der Schleife. Damit erstellt du das Array nur einmal und kannst es immer wieder benutzen.

Edit: Die Read-Methode des StreamReader ist etwas performanter als die ReadBlock-Methode. Beide liefern dir aber die Anzahl der Bytes, die tatsächlich eingelesen wurde. Du brauchst der Methode also nicht sagen, wie viel Bytes noch vorhanden sind:
Code:
char[] tmp = new char[1000000];
int len = 0;
while((len = tr.ReadBlock(tmp, 0 , 1000000)) != 0)
  gesamt.Append(buffer, 0, len);
 
Zuletzt bearbeitet:
Jetzt siehts so aus, geht aber immer noch nicht :( :
Code:
CryptoStream cstream = null;
            MemoryStream mstream = null;
            StreamReader reader = null;

            try
            {
                FileStream file = new FileStream(path, FileMode.Open);

                cstream = new CryptoStream(file, _rijndael.CreateDecryptor(_rijndael.Key, _rijndael.IV), CryptoStreamMode.Read);
                reader = new StreamReader(cstream, Encoding.GetEncoding(28591));

                int len = 0;
                StringBuilder gesamt = new StringBuilder();

                char[] tmp = new char[1000000];
                    while ((len = reader.ReadBlock(tmp, 0, 1000000)) != 0)
                    {
                        File.AppendAllText("LOG3.txt", "LEN = "+len.ToString()+Environment.NewLine);
                        gesamt.Append(new string(tmp), 0, len); 

                    }
                    reader.Close();
                    File.AppendAllText("LOG.txt",Environment.NewLine+gesamt.ToString());
                string[] trenn = new string[1]{"+*+++~##EEAD by Chriss000xx.sssd"};
                string[] trenn2 = new string[1] { "-#+++:" };
                string[] trenn3 = new string[1] { "filename::++" };
                string xaml = gesamt.ToString().Split(trenn,StringSplitOptions.None)[0];
                try
                {
                    try
                    {
                        for (int i = 0; i < gesamt.ToString().Split(trenn, StringSplitOptions.None)[1].Split(trenn2, StringSplitOptions.RemoveEmptyEntries).Length; i++)
                        {
                            filedata.Add(Encoding.GetEncoding(28591).GetBytes(gesamt.ToString().Split(trenn, StringSplitOptions.None)[1].Split(trenn2, StringSplitOptions.None)[i + 1].Split(trenn3, StringSplitOptions.None)[0]));
                            filenames.Add(gesamt.ToString().Split(trenn, StringSplitOptions.None)[1].Split(trenn2, StringSplitOptions.None)[i + 1].Split(trenn3, StringSplitOptions.None)[1]);
                        }
                    }
                    catch { }
                }
                catch
                {

                }

                return XamlReader.Parse(xaml) as FlowDocument;
            }
            catch (Exception e)
            {
                File.WriteAllText("LOG.txt", Environment.NewLine + e.Data + Environment.NewLine + e.Message);
                return new FlowDocument();
            }
            finally
            {
                try
                {
                    if (cstream != null)
                    {
                        cstream.Close();
                        cstream.Dispose();
                    }

                    if (mstream != null)
                    {
                        mstream.Close();
                        mstream.Dispose();
                    }

                    if (reader != null)
                    {
                        reader.Close();
                        reader.Dispose();
                    }
                }
                catch(Exception e)
                {
                    timer = true;
                    button.IsEnabled = false;
                    button.Width = 859;
                    button.Content = "Passwort falsch! Noch " + wait + " Sekunden warten";
                }
            }

Hier die beiden Logs:
LOG.txt
LOG3.txt

Kann man den StringBuilder eigentlich größer machen als einen normalen String? Denn ich glaube es liegt daran, dass wenn man den StringBuilder mit der .ToString() Methode zu einem String macht, die OutOfMemory Exception ausgelöst wird.
 
Code:
gesamt.Append(new string(tmp), 0, len);
Die Konvertierung nach String ist unnötig, Append akzeptiert auch ein char[].

Probiere mal folgendes:
Code:
                    reader.Close();
                    String decoded = gesamt.ToString();
                    File.AppendAllText("LOG.txt",Environment.NewLine + decoded);
und geh mal mit dem Debugger durch. Dann siehst du genau, wann die Exception gewirkten wird. (Und bitte alle anderen Vorkommen von "gesamt.ToString()" durch "decoded" ersetzen)
 
Geht leider immer noch nicht. Wie gehe ich durch den Debugger durch? Wollte ich schon immer mal wissen. :D
 
Zurück
Oben