在Delphi中读取文本文件

时间:2013-11-14 16:36:52

标签: delphi

您好我在运行函数来读取文本文件时出现问题似乎是我的防病毒程序阻止了我的delphi控制台程序,因为当我为可视化表单执行操作时没有问题。

Tengos两个代码就是这个:

function LeerArchivox(const filename: TFileName): String;
var
  List: TStringList;
begin

  if (FileExists(filename)) then
  begin

    List := TStringList.Create;
    List.Loadfromfile(filename);
    Result := List.text;
    List.Free;

  end;

end;

这是完美但不想使用组件类程序的重量并不重。

我也有这个:

function leerarchivo(filealeer: string): string;

var
  abriendo: TextFile;
  lineasleyendo: string;
  finaldearchivo: string;

begin

  finaldearchivo := '';
  AssignFile(abriendo, filealeer);
  Reset(abriendo);

  while not Eof(abriendo) do
  begin
    ReadLn(abriendo, lineasleyendo);
    finaldearchivo := finaldearchivo + lineasleyendo;
  end;

  CloseFile(abriendo);

  Result := finaldearchivo;

end;

其他代码。

function leerarchivo3(archivoaleer: string): string;

const
  BUFF_SIZE = $8000;
var
  dwread: LongWord;
  hFile: THandle;
  datafile: array [0 .. BUFF_SIZE - 1] of ansichar;
  codigofinal: string;

begin

  codigofinal := '';

  hFile := CreateFile(PChar(archivoaleer), GENERIC_READ,
    FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING,
    FILE_ATTRIBUTE_READONLY, 0);

  SetFilePointer(hFile, 0, nil, FILE_BEGIN);

  Readfile(hFile, datafile, BUFF_SIZE, dwread, nil);

  while (dwread > 0) do
  begin
    Readfile(hFile, datafile, BUFF_SIZE, dwread, nil);
    codigofinal := codigofinal + datafile;
  end;

  Result := codigofinal;

end;

这是问题所在,因为当我使用我的防病毒软件时删除它,我的问题是其他选择我必须在不使用类的情况下阅读文本文件。

有人可以帮助我吗?

4 个答案:

答案 0 :(得分:6)

此代码适用于我作为控制台应用程序,Delphi 2007,在Win7 64上运行:

'E:\ TempFiles \ Test.txt'的内容:

One
Two
Three
Four

来源:

program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  Txt: TextFile;
  s: string;
  AllText: string;

begin
  AllText := '';
  AssignFile(Txt, 'E:\TempFiles\test.txt');
  Reset(Txt);
  while not Eof(Txt) do
  begin
    Readln(Txt, s);
    AllText := AllText + s;

    // Write out each line; comment out to stop.
    Writeln(s);
  end;
  CloseFile(Txt);

  // Write out all content as a single string.
  WriteLn(AllText); 
  ReadLn;
end.

产生输出:

One
Two
Three
Four
OneTwoThreeFour

答案 1 :(得分:4)

您可以使用win32 api。

在我的一个应用程序中,我会执行类似的操作,扩展/修改以满足您的需求。这仅使用Win32 API并且不锁定文件。它就像记事本。当您使用记事本打开文件时,它不会被锁定,仍然可以被其他软件写入或读取。

const
  BUFF_SIZE = $8000;
var
  dwread:LongWord;
  hFile: THandle;
  datafile : array [0..BUFF_SIZE-1] of ansichar;

//create file handler
hFile := createfile(PChar(TFilePanel(FilePanelList.Items[i-1]).LongFileName), GENERIC_READ,
            FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, 0);

//set file pointer to beginning of file
SetFilePointer(hFile, 0, nil, FILE_BEGIN);

//read the file
try
    Readfile(hFile, datafile, BUFF_SIZE, dwread, nil);

    while (dwread > 0) do
    begin
      //read/use datafile     
      Here_do_something_with_datafile;

      Readfile(hFile, datafile, BUFF_SIZE, dwread, nil);
    end;
finally
   closehandle(hFile);
end;

答案 2 :(得分:1)

var txt : TextFile; 
begin 
  AssignFile(txt,'filetxt.txt'); 
  ReWrite(filetxt); 
  Writeln(filetxt,memo1.Lines.Text); 
  CloseFile(filetxt); 
  Reset(filetxt); 
  while not Eof(filetxt) do 
  begin 
    Readln(filetxt); 
  end; 
  CloseFile(filetxt);

答案 3 :(得分:0)

如果您不想使用Classes单元,只需要操作此文件,并且正在制作Windows可执行文件,您可以改用Windows单元并调用Win32 API函数:CreateFileReadFileCloseHandle及相关功能。