问题描述
|
我正在将应用程序从delphi 2007迁移到delphi xe,但是我在读取文件(ascii)并将内容存储在字符串中的过程中遇到问题
这是在delphi 2007中可以正常工作的代码
function LoadFiletoStr(const FileName: TFileName): String;
var
FileStream : TFileStream;
begin
FileStream:= TFileStream.Create(FileName,fmOpenRead or fmShareDenyWrite);
try
if FileStream.Size>0 then
begin
SetLength(Result,FileStream.Size);
FileStream.Read(Pointer(Result)^,FileStream.Size);
end;
finally
FileStream.Free;
end;
end;
但是当在delphi XE中执行此代码时,结果只是像\'???????? \'这样的符号,我知道哪个delphi xe是unicode,所以我更改了这些行
SetLength(Result,FileStream.Size);
至
SetLength(Result,FileStream.Size*2);
FileStream.Read(Pointer(Result)^,FileStream.Size);
将文件的内容存储在unicode字符串中,但结果是相同的。
how i can fix this procedure to read the content of this file?
解决方法
您的代码不起作用,因为您正在使用unicode字符串作为缓冲区读取文件的内容,因此您只是将字节从TFileStream的内部缓冲区移至unicode字符串,而忽略了编码。
您可以轻松地解决您的程序,只需将结果类型更改为
AnsiString
function LoadFileToStr(const FileName: TFileName): AnsiString;
但是我建议您使用TFile.ReadAllText
函数,而不是在单行代码中读取文件内容,还可以处理文件的编码。
,您可以使用ReadAllText函数用一行代码来实现。像这样:
Uses IOUtils;
TFile.ReadAllText(FileName);
TFile.ReadAllText(FileName,s,TEncoding.ASCII) // force encoding
它将正确检测ANSI,Unicode和二进制文件。
,您应该考虑编码,例如:
function LoadFileToStr(const FileName: TFileName): String;
var
FileStream : TFileStream;
Bytes: TBytes;
begin
Result:= \'\';
FileStream:= TFileStream.Create(FileName,fmOpenRead or fmShareDenyWrite);
try
if FileStream.Size>0 then begin
SetLength(Bytes,FileStream.Size);
FileStream.Read(Bytes[0],FileStream.Size);
end;
Result:= TEncoding.ASCII.GetString(Bytes);
finally
FileStream.Free;
end;
end;
//test
procedure TForm2.Button1Click(Sender: TObject);
begin
ShowMessage(LoadFileToStr(\'C:\\autoexec.bat\'));
end;
,我建议使用TStringList加载文件的内容,然后将结果设置为variable.Text,例如:
function LoadFileToStr(const FileName: TFileName): String;
var LStrings: TStringList;
begin
LStrings := TStringList.Create;
try
LStrings.Loadfromfile(FileName);
Result := LStrings.text;
finally
FreeAndNil(LStrings);
end;
end;
这样,您不必担心任何事情,它会向后并兼容将来的恕我直言。
编辑:如果您需要从TStream子孙中加载,则用LoadFromStream替换LoadFromFile。