在我资料夹软件编写的过程中,我用xml文档保存树形目录内容
保存代码
XMLDoc : TXMLDocument;
XMLDoc.SaveToFile(MyWorkDir+'Test.xml');
加载代码
XMLDoc.FileName :=MyWorkDir+'Test.xml';
XMLDoc.Active := True;
在安卓平台,自己保存好的文件,再自己读回来不出问题。
在win平台,自己保存好的文件,再自己读回来不出问题。
一开始根本想不到在交叉交换数据时会出错
在应用中,我将手机上的东西要备份到电脑上,然后将备份的数据恢复到手机上不出问题。
用win电脑的资料夹读itest.xml也不出问题,但是在,电脑上编辑添加完目录内容后,打包传送至手机上,在手机上运行程序时发生闪退。经过近6个小时跟踪,比对与排查才发现问题的根源。
XMLDoc.SaveToFile 在手机上保存有回车符的string时,磁盘上文件里是回车符保存的是“0a”
XMLDoc.SaveToFile 在电脑上保存有回车符的string时,磁盘上文件里是回车符保存的是“
”
XMLDoc.LoadFromFile 在电脑上这两种格式的xml都可以正常加载,但在手机上只认第一种,读电脑平台上的xml会失败,造成应用闪退。
另外,在电脑上保存的xml十六进制查看结果
在手机上的xml格式
另外,在电脑上保存的xml文件比手机端保存的文件少一个3个字节的文件头 ‘EF BB BF'
最后我采取的解决方案是:
在电脑上保存完成后,再次进行处理,以确保复制到手机上可用
1、把文件前加上'EF BB BF'。
2、将xml中的'
' 替换为'#10',即'0A'
从而确保了文件兼容性
form2.memo2.Lines.LoadFromFile(MyWorkDir+'Test.xml');
form2.memo2.Lines.Text:=StringReplace(form2.memo2.Lines.Text,'
' ,#10 , [rfReplaceAll]);
form2.memo2.Lines.SaveToFile(MyWorkDir+'Test.xml');
procedure TForm2.AddUTFChar(fn:string);
var f1,f2: file of byte ;
var ch:byte;
begin //var
assignfile(f1,fn);
reset(f1);
assignfile(f2,myworkdir+'temp.xml');
rewrite(f2);
ch:= $EF ;
write(f2,ch);
ch:= $BB ;
write(f2,ch);
ch:= $BF ;
write(f2,ch);
while not eof(f1) do
begin
read(f1,ch);
write(f2,ch);
end;
CloseFile(F1);
CloseFile(F2);
Tfile.delete(fn);
Tfile.Copy(myworkdir+'temp.xml',fn,true);
Tfile.delete(myworkdir+'temp.xml');
end;