Вот две функции, которые делают то, что вы хотите:
function StringFromFile(const FileName: TFileName): RawByteString;
var F: THandle;
Size: integer;
begin
result := '';
if FileName='' then
exit;
F := FileOpen(FileName,fmOpenRead or fmShareDenyNone);
if PtrInt(F)>=0 then begin
{$ifdef LINUX}
Size := FileSeek(F,0,soFromEnd);
FileSeek(F,0,soFromBeginning);
{$else}
Size := GetFileSize(F,nil);
{$endif}
SetLength(result,Size);
if FileRead(F,pointer(Result)^,Size)<>Size then
result := '';
FileClose(F);
end;
end;
function FileFromString(const Content: RawByteString; const FileName: TFileName;
FlushOnDisk: boolean=false): boolean;
var F: THandle;
L: integer;
begin
result := false;
F := FileCreate(FileName);
if PtrInt(F)<0 then
exit;
if pointer(Content)<>nil then
L := FileWrite(F,pointer(Content)^,length(Content)) else
L := 0;
result := (L=length(Content));
{$ifdef MSWINDOWS}
if FlushOnDisk then
FlushFileBuffers(F);
{$endif}
FileClose(F);
end;
Они используют функции FileOpen / FIleSeek / FileRead / FileWrite низкого уровня.
И вы можете указать любую опцию fmShare*
вам нужно.
Используется тип RawByteString
, поэтому он ожидает, что текст будет обрабатываться байтово-ориентированным способом.Он не будет работать с текстовым файлом Unicode, но с Ansi Text.Вам придется установить соответствующую кодовую страницу, если вы хотите взаимодействовать с ней, используя строковый тип начиная с Delphi 2009.
До Delphi 2009 просто определите:
type
RawByteString = AnsiString;