2016-04-29 119 views
-1

在我的德尔福西雅图10个应用程序,我读使用文本文件的文本文件(实际上是一个ini文件),如下:在Delphi使用文本文件的Android

SDPath := ClientUtils.GetSharedPath; 
    FileName := TPath.Combine(SDPath, 'Client.ini'); 
    if not MemoVisible then 
    begin 
     Panel2.Visible := True; 
     if FileExists(FileName) then 
     begin 
     MemoConfig.Lines.Clear; 
     AssignFile(T, FileName); 
     try 
      Reset(T); 
      while not Eof(T) do 
      begin 
      ReadLn(T, text); 
      MemoConfig.Lines.Add(text) 
      end; 
     finally 
      CloseFile(T); 
     end; 
     end 

我注意到,第一行包含[Configuration],另外3个不在原始文件中的字符。我猜这是从我的Windows 7 PC上部署client.ini文件时发生的。在我编辑完字符并保存文件后

 AssignFile(T, FileName); 
     try 
     Rewrite(T); 
     for i := 0 to MemoConfig.Lines.Count -1 do 
      WriteLn(T, MemoConfig.Lines[i]); 
     finally 
     CloseFile(T) 
     end; 

该文件保持正确。额外字符来自哪里,我能做些什么来阻止他们进入文件?

+1

三个字节是一个BOM。一个字节顺序标记。你在Windows中使用了哪个编辑器? – greenapps

+3

停止使用AssignFile和ReadLn并进入现代。您可以使用TStringList.LoadFromFile将整个文件读入TStringList,或使用TFileStream或TStringStream来读取它。事实上,你的备忘录可以使用'MemoConfig.Lines.LoadFromFile'直接加载它。 –

+0

由于您可以在一次调用中直接加载文件内容,因此您的代码毫无意义。 –

回答

2

这些字符是字节顺序标记,表示您的文件编码为UTF-8。经典的Delphi文件读取功能不知道字节顺序标记。

为防止它们出现在您的文件中,请查阅您用于创建文件的程序的文档。您可以选择显式排除标记,也可以选择不同的编码。

您可能希望避免进一步使用经典的文本文件功能。你可以用一个函数调用替换大部分代码:

MemoConfig.Lines.LoadFromFile(FileName); 

这个功能还提供了额外的参数让你更加明确一些读取文件时使用何种文本编码。你应该总是知道你正在使用什么文本编码,特别是对于像你这样控制的文件。

1

这些字符是Unicode UTF-8字节顺序标记(EFBBBF十六进制)。

您可以通过正确保存文件并使用任何文本编辑器来创建它,以防止它们回来。将文件保存为ASCII或ANSI格式的文本。

就你的代码而言,它的工作要比应该做的多得多。您可以将文件加载到你的备忘录容易得多:

SDPath := ClientUtils.GetSharedPath; 
FileName := TPath.Combine(SDPath, 'Client.ini'); 
if not MemoVisible then 
begin 
    Panel2.Visible := True; 
    if FileExists(FileName) then 
    begin 
    MemoConfig.Lines.Clear; 
    MemoConfig.Lines.LoadFormFile(FileName); 
    end; 
end; 

您的代码保存那么该文件将成为相反:

MemoConfig.Lines.SaveToFile(FileName); 
+0

我在Windows 7 PC上使用记事本最初创建文件。然后使用Deployment Manager将其部署到Android。我应该使用LoadFromFile(FileName,TEncoding.UTF8)的重载版本吗? – nolaspeaker

+0

记事本的默认值应该是ANSI编码(至少它在我的机器上),它不包含字节顺序标记。如果您在记事本中创建了一个新的空文本文件,然后执行另存为,保存按钮旁边的底部列出了哪些编码? –

+0

并回答你的问题,你不应该使用重载的版本; TStringList.LoadFromFile应该自动检测BOM。另外,出于好奇,如果您使用INI文件,为什么不使用System.IniFiles.TIniFile?它在西雅图是跨平台的。 –

相关问题