【问题标题】:Want to read a file to a TStringList想要将文件读取到 TStringList
【发布时间】:2009-01-15 06:46:56
【问题描述】:

是的,我想将一个简单的日志文件读入 TStringList,这很容易通过 LoadFromFile 完成。但问题是该文件可能已经被另一个程序同时打开,因此可能会出现异常。我试过用:

FileMode := fmShareCompat;

但它不会起作用。

我也试过用:

fFilePath := fPathList[PathIndex] + '\' + FileData.Name;
AssignFile(vFile, fFilePath);
Reset(vFile, 1);  // Recordsize = 1

SetLength(vFileString, FileData.Size);
BlockRead(vFile, vFileString, FileData.Size);   
vCurrentFile.Text := vFileString;

它引发一个 EInOutError 并带有消息 I/O 错误 998。

有什么建议吗?

【问题讨论】:

    标签: delphi file-io tstringlist


    【解决方案1】:

    尝试 LoadFromStream 并执行以下操作:

    fileStream := TFileStream.Create(aFileName, fmShareDenyNone);
    myTStringList.LoadFromStream(fileStream);
    fileStream.Free();
    

    【讨论】:

    • 不要在应用程序中直接调用 Destroy。相反,调用 Free,它会检查 TFileStream 引用是否不为零,然后才调用 Destroy。
    • 更正:在上面的示例中,销毁是完全可以接受的。 MyObject.Free 等价于 if MyObject <> nil then MyObject.Destroy。您使用Free 的原因是为了检查是否已分配引用。在上面的示例中,您可以安全地保证通过到达第 3 行 fileStream 引用了正确创建的对象。然而,缺少的是try..finally 声明(更多的问题)。此外,根据fileStream 变量的范围,建议清除它:finally fileStream.Destroy; fileStream := nil; end;
    • 在开始讨论 Free 或 Destroy 之前,您可能需要阅读以下内容:blogs.embarcadero.com/abauer
    • 我总是对为什么有两种方法可用感到困惑,老实说,我几乎在每种情况下都使用 Destroy over Free。这是因为在我没有分配对象的情况下它会抛出异常,因此可以更快地检测到错误。
    • 我在 allen bauer 的博客上找不到讨论。出于某种原因,我认为调用 Destroy 也很糟糕。 (inzKulozik 的评论)。我不知道直接调用是否安全。
    【解决方案2】:

    fmShareCompat 可能应该被标记为已弃用。你想要 fmShareDenyNone (as Drejc said)

    我相信 fmShareCompat 来自 16 个 DOS 天。在 Windows 上,它的处理方式与 fmShareExclusive 相同。当支持 Linux 时,它被视为与 fmShareDenyNone 相同。

    【讨论】:

      【解决方案3】:

      另外,try..except 和 try..finally 在这些时候是好朋友。将您的文件读取代码封装在这些类型的块中,并告诉用户出现的问题。

      【讨论】:

      • 是的,我知道。但我想在一个目录中搜索许多日志文件。如果我尝试除了每个文件加载之外,它可能会减慢执行速度。已经很慢了……/Roland
      • 你实际上想要一个 try / finally 为每个文件。除非您正在阅读大量非常小的文件,否则我认为它不会显着影响性能。如果是这样,那么您可能需要一起考虑不同的机制。
      • @Niklas:不!不!不!又不!不要滥用try..except!从长远来看,使用 try..except 隐藏错误会导致大量潜在的错误。
      • @Craig Young:您是否错过了我的回答中“......并告诉用户出现的问题”的部分?这不是隐藏错误,而是在我的书中优雅地处理它们。
      猜你喜欢
      • 2014-05-08
      • 2013-02-27
      • 1970-01-01
      • 1970-01-01
      • 2017-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多