zoukankan      html  css  js  c++  java
  • Delphi各种从文件里读取内容的方法

    Hi I am having a problem running a function to read a text file the problem seems to be that my antivirus blocks my delphi console program because when I do for a visual form there is no problem .

    Tengos two codes one is this :

    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;

    This goes to perfection but do not want to use the component Classes for the program does not weigh much .

    Also I have this :

    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;

    Other code.

    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;

    This is the problem because when I use my antivirus deletes it at the time , my question to other alternatives I have to read a text file without using Classes.

    Someone can help me?

    shareimprove this question
     
    3  
    I don't know about what your AV software is doing, but the second code you posted isn't real, because it won't compile. (finalarchivo : = + lineasleyendo finaldearchivo is not valid Delphi syntax. If you want help with your code, post your real code. We can't debug code you make up as you go, because you could change the real problem while you're making it up. – Ken White Nov 14 '13 at 16:41
        
    You can use the solution with TStringList also from a console program! Classes and components / visual forms are two very different things. – jpfollenius Nov 14 '13 at 16:44
        
    ken, the real code is that google traslate is that I moved the code.jpfollenius, what I'm looking for is how to do it without TStringList – Jose Martinez Nov 14 '13 at 16:48 
    1  
    @Jose: Then don't run your code through Google Translate. Run your text, but not the code. – Ken WhiteNov 14 '13 at 17:03
        
    "This goes to perfection but do not want to use the component Classes for the program does not weigh much ." -> So you weight the weight of the resulting binary higher than a good design? Then I recommend strongly to turn off $R,D,L,Q and all other compiler/linker settings regarding assertions, checks and debug symbols. Will make debugging worse, but the size of the EXE shrinks dramatically. – JensG Nov 14 '13 at 17:52 

    4 Answers

    You can use win32 api.

    In one of my apps I do things like that, extend/modify to match your needs. This only use Win32 API and does not lock the file. It's like notepad. When you open a file with notepad it is not locked and can still be written or read by other software.

    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;
    shareimprove this answer
     
        
    thanks for the help hpterm, the code is perfect, update your code in my post, because I'm making a function called leerarchivo3 () in your code, the problem is not how to use datafile variable to store the total content of the variable codigofinal, I ask you to tell me I did or wrong or I can do what I want, I hope not ask for much – Jose Martinez Nov 14 '13 at 17:22
        
    I thought your question was how to open a file without using TStringList. As @StijnSanders said, in that case use Win32 API. That's what I show you here. If now the question has changed, ask another one. I'm sorry I am not sure I understand what you need now. – HpTerm Nov 14 '13 at 17:25
        
    the problem I have now is that when using your code try to keep the entire contents of that file in your code is datafile in a single string called codigofinal what I mean to return after using codigofinal value Result:=codigofinal – Jose Martinez Nov 14 '13 at 17:40
    1  
    @JoseMartinez: My code shows how to do that using AssignFile, which is what you originally asked. If mine doesn't answer, and HpTerm's doesn't answer, and Stijn's doesn't answer, then your question is very unclear, and you need to edit to improve it so we know what you're really asking. – Ken White Nov 14 '13 at 17:43 
    1  
    @Jose: My code does in fact work; I even showed the output. – Ken White Nov 14 '13 at 17:51
    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);
    shareimprove this answer
     

    This code works fine for me as a console application, Delphi 2007, running on Win7 64:

    Contents of 'E:TempFilesTest.txt':

    One
    Two
    Three
    Four

    Source:

    program Project2;
    
    {$APPTYPE CONSOLE}
    
    uses
      SysUtils;
    
    var
      Txt: TextFile;
      s: string;
      AllText: string;
    
    begin
      AllText := '';
      AssignFile(Txt, 'E:TempFiles	est.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.

    Produces output:

    One
    Two
    Three
    Four
    OneTwoThreeFour
    shareimprove this answer
     
        
    +1 for a working answer. Seems the OP is not very clear about what he wants. – HpTerm Nov 14 '13 at 17:49
        
    @HpTerm: Thanks. I've done the same for yours. Seems he's finally decided, too; you got the accept as well. – Ken White Nov 14 '13 at 17:50
    2  
    Next time I see someone use old-style file functions ... don't know what to do. We really need a banned API list in Delphi. – JensG Nov 14 '13 at 17:55
        
    @JensG: Agreed. I haven't used them since TFileStream was introduced. I had to do some dusting to uncover the memories of how to do so. :-) – Ken White Nov 14 '13 at 18:00
        
    @JensG : I also agree. – HpTerm Nov 14 '13 at 18:23

    If you don't want to use the Classes unit, only need to operate on this file, and are making a Windows executable, you could use the Windows unit instead and call the Win32 API functions: CreateFileReadFileCloseHandle and related functions.

    shareimprove this answer

    https://stackoverflow.com/questions/19983202/read-text-files-in-delphi

  • 相关阅读:
    编辑器漏洞
    csrf漏洞
    sdram控制2
    简易sdram控制1
    8051核
    AD7928
    FIR滤波器的verilog实现方法
    fft_cepin
    fft_fft_control
    FFT_fifo
  • 原文地址:https://www.cnblogs.com/findumars/p/5962124.html
Copyright © 2011-2022 走看看