2016-04-29 115 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?它在西雅圖是跨平臺的。 –

相關問題