Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

DouglasP

[Resolvido] Ler txt

Recommended Posts

Boa tarde,

queria saber como ler um txt no seguinte formato:

 

Código:

#root
12202,teste.dll
#Data/
10012,macro.txt

onde oque tem # antes seria o local de onde o arquivo esta e oque vem depois é o tamanho do arquivo e o nome separado por virgula.

 

preciso jogar esses campos em um listbox para poder baixar e salvar no local certo.

 

grato.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pode fazer assimc cara:

 

procedure TrataArquivo(FileName: string);
var
   pasta, nome, temptamanho : string;
   tamanho, cont: integer;
   arq: TextFile;
   temp : string;
begin
    if (FileExists(FileName)) then
    begin
        AssignFile(arq, FileName);
        Reset(arq);
        try
            while (not(EOF(arq))) do
            begin
                //ler a pasta
                Readln(arq, temp);
                pasta := Copy(temp, 2, Length(temp)-1);
                //ler tamanho e nome
                Readln(arq, temp);
                temptamanho := '';
                for cont := 1 to length(temp) do
                begin
                    if temp[cont] = ',' then
                        break
                    else
                        temptamanho := temptamanho+temp[cont];
                end;
                tamanho := StrToInt(temptamanho);

                nome := Copy(temp, cont+1, Length(temp)-Cont);
                {******************************************************************************************}
                {aqui estão os valores que você quer respectivamente nas variaveis pasta, nome e tamanho}
                    ShowMessage(pasta);
                    ShowMessage(nome);
                    ShowMessage(IntToStr(tamanho));
                {******************************************************************************************}
            end;
        finally
        end;
    end
    else
        EConvertError.Create('Arquivo não encontrado.');
end;

espero que ajude

Compartilhar este post


Link para o post
Compartilhar em outros sites

Funcionou exatamente como eu queria,

agora como faço para pegar os dados e gravar separadamente em um combobox ?

tipo a pasta no combobox1, o nome do arquivo no combobox2 e o tamanho no combobox3.

 

grato.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se eu coloco assim:

 

#root
12202,teste.dll.rar
#Data\
10012,macro.txt.rar
10018,novo.txt.rar
#Data\Local
20012,Player.bmd.rar

da erro :/

fala que #Data\Local não é inteiro algo do genero.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa beleza, então fica assim

 

declare isso na sessão "type" da sua unit

 

  
TRegFiles = record
        FileSize: integer;
        FileName: string;
    end;

    TRegPasta = record
        Endereco : string;
        Arquivos : array of TRegFiles;
        FilesCount : integer;
    end;

    arrayRetorno = array of TRegPasta;


esses são as estruturas e tipos de dados que a função vai utilizar e retornar

 

e aqui vai a função

 


function TrataArquivo(FileName: string): ArrayRetorno;
var
   temptamanho : string;
   cont: integer;
   arq: TextFile;
   temp : string;
   tempRP : TRegPasta;
begin
    SetLength(Result, 1);
    if (FileExists(FileName)) then
    begin
        AssignFile(arq, FileName);
        Reset(arq);
        try
            Readln(arq, temp);
            while (not(EOF(arq))) do
            begin
                //ler a pasta
                if (temp[1] = '#') then
                begin
                    tempRP.Endereco := Copy(temp, 2, Length(temp)-1);
                    //ler tamanho e nome
                    readln(arq, temp);
                    setLength(tempRP.Arquivos, 1);
                    tempRP.FilesCount := 0;
                    while ((Length(temp)>0) and (temp[1] <> '#')) do
                    begin
                        inc(tempRp.FilesCount);
                        setLength(tempRP.Arquivos, tempRP.FilesCount+1);
                        temptamanho := '';
                        for cont := 1 to length(temp) do
                        begin
                            if temp[cont] = ',' then
                                break
                            else
                                temptamanho := temptamanho+temp[cont];
                        end;
                        tempRP.Arquivos[tempRP.FilesCount].FileSize := StrToInt(temptamanho);
                        tempRP.Arquivos[tempRP.FilesCount].FileName := Copy(temp, cont+1, Length(temp)-Cont);
                        readln(arq, temp);
                    end;
                    {******************************************************************************************}
                    {aqui estão os valores que você quer respectivamente utilizando:
                        tempRP.Endereco -> endereco da pasta
                        tempRP.FilesCOunt -> total de arquivos
                        tempRP.Arquivos[n].FileSize -> tamanho do arquivo "n"
                        tempRP.Aquivos[n].FileName -> nome do arquivos "n"

                    }
                    {Você pode tratar os valores aqui, mas eu coloquei todo o arquivo em um array que é
                    retornado pela função}
                    {******************************************************************************************}
                    Setlength(Result, Length(Result)+1);
                    Result[Length(Result)-1] := tempRP;
                end;
            end;
        finally
        end;
    end
    else
        EConvertError.Create('Arquivo não encontrado.');
end;

se quiser dar uma testada, coloque ai no seu form um "TOpenDialog" e um "TButton" e no evento "onClick" do seu Botão coloque isto:

 


procedure TForm1.Button1Click(Sender: TObject);
var
    teste : arrayRetorno;
    cont, cont2: integer;
    cbs : array of TComboBox;
    topinc : integer;
begin
    if (OpenDialog1.execute) then
    begin
        teste := TrataArquivo(OpenDialog1.FileName);
        topinc :=0;
        for cont := 1 to Length (teste)-1 do
        begin
            SetLength(cbs, cont+1);
            cbs[cont] := TComboBox.Create(nil);
            cbs[cont].Parent := Self;
            cbs[cont].Top := topinc;
            inc(topinc, cbs[cont].Height+10);
            cbs[cont].Show;
            for cont2 := 1 to teste[cont].FilesCount do
            begin
                cbs[cont].Items.Add(teste[cont].arquivos[cont2].FileName + '( '+inttostr(teste[cont].arquivos[cont2].FileSize)+')');
            end;
        end;
    end;
end;

espero que ajude

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, que bom que conseguiu, mas so explicando caso alguém um dia venha a precisar.

 

"TRegFiles = record" retornou erro pois estas declarações devem ser volocadas logo após a diretiva "type" da unit, antes das declarações das classes

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.