حفظ/تحميل محتوى RichTextBox مع بيانات أخرى باستخدام C#

StackOverflow https://stackoverflow.com/questions/688660

  •  22-08-2019
  •  | 
  •  

سؤال

أحاول حاليًا معرفة كيفية حفظ المحتوى من RichTextbox في دفق (يستخدم حاليًا FileStream) والقيام بذلك جنبًا إلى جنب مع مجموعة من البيانات الأخرى.ثم بالطبع أريد أن أتمكن من التحميل من هذا الملف.كنت أحاول حاليًا استخدام شيء ما على النحو التالي.

FileStream stream = new FileStream(); //this is actually correctly defined.
ASCIIEncoding encoding = new ASCIIEncoding();

//write Title
byte[] array = encoding.GetBytes(Title);
stream.WriteByte(Convert.ToByte(array.Length));
stream.Write(array, 0, array.Length);

//save textRange
textRange.Save(stream, System.Windows.DataFormats.Rtf);

//write Subtitle
byte[] array = encoding.GetBytes(Subtitle);
stream.WriteByte(Convert.ToByte(array.Length));
stream.Write(array, 0, array.Length);
//ect...and something very similar for Loading a file.

هذا هو في الأساس ما أحاول القيام به.أقوم بالفعل بحفظ نطاقين TextRanges ومجموعة أخرى من الخصائص.لذا فإن مشكلتي هي أن TextRange.Load() يقرأ حتى نهاية الملف... مما يجعل من المستحيل بالنسبة لي استخدام ذلك مع الأخذ في الاعتبار أن لدي نطاقين TextRanges أحتاج إلى حفظهما/تحميلهما.لذا أحاول هنا التوصل إلى طريقة أخرى لأتمكن من حفظ/تحميل محتوى RichTextBox مع بيانات أخرى.ليس من الضروري استخدام Stream.أنا منفتح إلى حد كبير على أي حلول ممكنة.شكرا لك مقدما!

~ جيسون

هل كانت مفيدة؟

المحلول

يمكنك التحميل/الحفظ في MemoryStream لحل مشكلتك في القراءة حتى نهاية الملف.يمكن أن يبدو مثل هذا:

  • قم بتحميل الملف الخاص بك إلى الذاكرة
  • قم بتحميل قسم هذا الملف الذي يمثل محتويات مربع النص المنسق في MemoryStream
  • قم بتحميل محتويات مربع النص المنسق من MemoryStream

أم أنك تريد معرفة كيفية إنشاء ملف وتحليله ليحتوي على أقسام مختلفة للعنوان والمحتويات وأي حقول أخرى؟

نصائح أخرى

اعتقدت أنني يجب أن أنشر الحل الحالي.يبدو أنه يعمل بشكل جيد تماما.شكرًا لك كريس وأنتس على التلميحات حول كيفية القيام بذلك.

/// <summary>
    /// Reads a TextRange (DataFormats.Rtf) from the stream.
    /// </summary>
    /// <param name="stream">The stream to be read from.</param>
    /// <returns>The TextRange (DataFormats.Rtf) that was read from the stream.</returns>
    public static TextRange ReadTextRange(FileStream stream)
    {
        long startPos = stream.Position;
        int length = -1;
        int count = 0;
        int previousByte = 0;
        int currentByte = 0;
        //set previousByte to give the current one something to compare to
        previousByte = stream.ReadByte();
        //parse the file counting the { and } to find the end of the rtf portion of the file.
        while (count > 0 || length < 1)
        {
            length++;
            stream.Position = startPos + length;
            currentByte = stream.ReadByte();
            if (previousByte != 92) // not '\' so check to see if '{' or '}' is currentByte
            {
                if (currentByte == 123) // '{' increase count
                    count++;
                else if (currentByte == 125) // '}' decrease count
                    count--;
            }
            previousByte = currentByte;
        }
        //save finish position to move to later
        long finishPos = stream.Position;
        //reset stream position to start at beginning of rtf
        stream.Position = startPos;
        //read the rtf portion of the file into a byte[]
        byte[] content = new byte[length];
        stream.Read(content, 0, length);
        //put the byte[] into a memory stream
        MemoryStream memStream = new MemoryStream(content);
        FlowDocument doc = new FlowDocument();
        TextRange range = new TextRange(doc.ContentStart, doc.ContentEnd);
        //have the TextRange read from the memorystream
        range.Load(memStream, System.Windows.DataFormats.Rtf);
        memStream.Close();
        //set the position to after the rtf portion of the file
        stream.Position = finishPos;
        return range;
    }

توجد طريقة ReadTextRange هذه في فئة StreamHelper التي قمت بتحديدها للمساعدة في القراءة من FileStream.كل هذا يهدف إلى تحميل TextRange الذي تم حفظه في FileStream مثل هذا...

//save query (TextRange)
        Query.Save(stream, System.Windows.DataFormats.Rtf);

آمل أن يجد شخص ما هذا مفيدًا إذا/عندما يواجه مشكلة مماثلة!:د

يحرر:

لقد استخدمت ملف تعريف ووجدت أن هذا الرمز لم يكن فعالاً للغاية، لذا قمت بتغيير هذا الرمز ليكون أكثر كفاءة بعدة طرق.

  1. بدلاً من استخدام TextRange واستخدم بايت[] الذي يحمل محتويات MemoryStream memStream.يؤدي هذا إلى قطع النطاق.التحميل الذي يستهلك الكثير من وحدة المعالجة المركزية.

  2. لقد قمت بإزالة خط التدفق.Position = startPos + length لأنني أدركت أنه كان عديم الفائدة بعد التشغيل الأول واستهلكت أيضًا قدرًا لا بأس به من وحدة المعالجة المركزية.لقد وضعت تيار.Position--;بعد السطر PreviousByte =stream.ReadByte();

أدركت أيضًا أنني كنت مبرمجًا سيئًا ولم أتبع MVC من خلال وجود TextRange، عنصر واجهة المستخدم، داخل فئة البيانات الخاصة بي.الآن أصبح يحتوي على بايت[]، وهو أفضل بكثير.

تحرير مرة أخرى:

بعد بضع دقائق من الحصول على البايت[] بدلاً من TextRange أدركت أن لدي حجم البايت[] لذا لم أكن بحاجة إلى تحليله.لذا بدلًا من ذلك أقوم بحفظ حجم البايت[] ثم البايت[].وهذا يجعله سريعًا للغاية ويمكنه قراءة ملف كبير جدًا على الفور تقريبًا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top