【问题标题】:Delphi. SynEdit - load last 500 KB of file德尔福。 SynEdit - 加载最后 500 KB 的文件
【发布时间】:2011-06-08 13:38:33
【问题描述】:

请给我一些建议。

如果文件超过 500 KB,我如何将最后 500 KB 的文件加载到 UniSynEdit/SynEdit 中?

谢谢!!!

【问题讨论】:

    标签: delphi text load size synedit


    【解决方案1】:

    您可以选择将文件的最后 500 KB 复制到一个临时文件中,然后让 synEdit 处理该临时文件。

    【讨论】:

    • “要求 synEdit 处理临时文件”是什么意思?
    【解决方案2】:

    创建一个TFileStream 并寻找到您要从中加载的位置,然后将流传递给编辑控件。它应该从当前位置加载。

    var
      stream: TStream;
    begin
      stream := TFileStream.Create(filename, fmOpenRead);
      try
        stream.Seek(-500 * 1024, soEnd);
        edit.Lines.LoadFromStream(stream);
      finally
        stream.Free;
      end;
    end;
    

    请注意,如果文件被编码为 UTF-8 或其他每个字符使用可变字节数的编码,则跳转到文件中的任意位置是不安全的。您可能会跳转到一个代表双字节序列后半部分的字节,然后您读取的所有后续字符都可能被错误地解释。 ANSI 和 UTF-16 文件没有这种危险。

    【讨论】:

    • @Rob:如果你要找的位置在一行的中间会发生什么?
    • 真正好的是一个适配器类,它是 TStream 的后代,你可以将一个 Stream、一个位置和一个长度传递给它,并且适配器将作为一个只读取指定部分的 Stream 工作的文件。这将允许您扩展 Rob 的想法并能够读取文件的任何部分,而不仅仅是结尾。
    • 然后你得到了行的后半部分,@Smasher。没什么大不了的。更糟糕的是,如果您寻找到一个字符的中间。但是,如果代码需要处理其中任何一种情况,那么您需要从开头(对于行或字符)或结尾(对于行)解析文件。
    • 如果是 UTF16 文件,那么字符的中间很容易避免,只需转到偶数位置即可。如果它是 UTF8,那么它仍然可以从头开始不解析,但它涉及更多一点。无需从头(或尾)解析,以避免落在字符中间。
    • 好主意!我问是因为 SydEdit 卡住了,当我加载大文件时应用程序没有响应,是否有虚拟模式?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-08
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多