3

嗨,我在运行读取文本文件的函数时遇到问题,问题似乎是我的防病毒软件阻止了我的 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;

这样就完美了但是不想使用组件的 Classes 对于程序来说并没有太大的分量。

我也有这个:

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;

这是问题所在,因为当我使用我的防病毒软件时将其删除,我对其他替代方案的问题是我必须在不使用 Classes 的情况下读取文本文件。

有人可以帮助我吗?

4

4 回答 4

7

这段代码在 Win7 64 上运行的控制台应用程序 Delphi 2007 对我来说很好用:

'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
于 2013-11-14T17:20:38.043 回答
5

你可以使用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;
于 2013-11-14T17:06:20.627 回答
2
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);
于 2014-09-15T08:50:46.000 回答
0

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

于 2013-11-14T16:53:28.880 回答