Ir para conteúdo
Fórum Script Brasil
  • 0

Como juntar vários arquivos .Dat em 1 (Um)


LucAlucard

Pergunta

Olá família ScriptBrasil. Hoje venho mais uma vez até vocês para pedir ajuda... (rsrs)

Gostaria de saber se vocês sabem como juntar vários arquivos .Dat em um único arquivo em memória. Por exemplo:

begin
whitecomponentresfile('Dat1.dat'+'Dat2.dat'+'Dat3.Dat', ComponenteQualquer);
end;

muito obrigado pela ajuda, qualquer dúvida por favor entrem em contato, ou respondam esse fórum q responderei assim q possível.

Editado por LucAlucard
Link para o comentário
Compartilhar em outros sites

23 respostass a esta questão

Posts Recomendados

  • 0

o arquivo .Dat é um texto ?

se for .. use:

var f:TextFile; Linha:String;
begin
 AssignFile(f, 'Caminho do Arquivo.Dat');
 Reset(f);
 While not Eof(f) do
   Readln(f, Linha);
 CloseFile(f);
end;

faça isso para arquivo ... que podera ser jogado tudo em um memo e depois salvo

ou pode abrir o primeiro deles como escrita e ir lendo os outros e jogando os dados no primeiro

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

OK ... este não é um arquivo texto e sim de dados

faça o seguinte teste:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  File1, File2 : string;
implementation

{$R *.DFM}

procedure MyCopyFile(FromName, ToName: string);
var
   FromF, ToF : file;
   NumRead, NumWritten : Integer;
   Buf: array[1..2048] of Char;
begin

   Reset(FromF,1);
   AssignFile(ToF, Form1.SaveDialog1.Filename);
   Rewrite(ToF,1);
   repeat
      BlockRead(FromF, Buf, SizeOf(Buf), NumRead);
      BlockWrite(ToF, Buf, NumRead, NumWritten);
   until (NumRead = 0) or ( NumWritten <> NumRead);
   CloseFile(FromF);
   CloseFile(ToF);

end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  // abrir arquivo1
  if OpenDialog1.Execute then
     File1 := OpenDialog1.FileName;

  // abrir arquivo2
  if OpenDialog1.Execute then
     File2 := OpenDialog1.FileName;

  // copiar arquivo1 para arquivo2
  MyCopyFile(File2, File1);
end;

end.

Se o conteudo for texto , vai dar erro ... se for dados deve funcionar

OBS: a concatenação desse tipo de arquivo pode não funcionar do jeito que voce está querendo ou pode não funcionar mais ... cuidado

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
OBS: a concatenação desse tipo de arquivo pode não funcionar do jeito que voce está querendo ou pode não funcionar mais ... cuidado

abraço

OK muito obrigado Jhonas, vou fazer um teste em um arquivo teste. Se funcionar ótímo! ^^

Já q eu posto aqui o resultado dos testes..

Link para o comentário
Compartilhar em outros sites

  • 0
OK ... este não é um arquivo texto e sim de dados

faça o seguinte teste:

unit Unit1;
  procedure MyCopyFile(FromName, ToName: string);
  var
     FromF, ToF : file;
     NumRead, NumWritten : Integer;
     Buf: array[1..2048] of Char;
  begin
  
    [color="#ff0000"] Reset(FromF,1);[/color]
     AssignFile(ToF, Form1.SaveDialog1.Filename);
     Rewrite(ToF,1);
     repeat
        BlockRead(FromF, Buf, SizeOf(Buf), NumRead);
        BlockWrite(ToF, Buf, NumRead, NumWritten);
     until (NumRead = 0) or ( NumWritten <> NumRead);
     CloseFile(FromF);
     CloseFile(ToF);
  
  end;

Jhonas.. ele ta dando erro logo na linha "Reset(FromF,1);", o erro que ele da é o seguinte I/O Error. Nunca ví esse erro e nunca trabalhei com esse tipo de variavel pra Buf.. você pode me ajudar por favor? Vou dar uma pesquisada na internet sobre o erro mas, nunca vi ele.. se você puder me ajudar assim como você vem me ajudando agradeceria muito ^^

Editado por LucAlucard
Link para o comentário
Compartilhar em outros sites

  • 0

ok ... me esqueci de um detalhe ... o comando Rewrite zera o arquivo destino

então tente essa modificação

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  File1, File2 : string;
implementation

{$R *.DFM}

procedure MyCopyFile(FromName, ToName: string);
var
   FromF, ToF : file;
   NumRead, NumWritten : Integer;
   Buf: array[1..2048] of Char;
   Ch : Char;
begin
   AssignFile(FromF, FromName);
   Reset(FromF,1);
   AssignFile(ToF, ToName);
   Reset(ToF,1);

   Seek(ToF, FileSize(ToF));

   //ReWrite(ToF,1);
   repeat
      BlockRead(FromF, Buf, SizeOf(Buf), NumRead);
      BlockWrite(ToF, Buf, NumRead, NumWritten);
   until (NumRead = 0) or ( NumWritten <> NumRead);
   CloseFile(FromF);
   CloseFile(ToF);
   showmessage('Copia efetuada com sucesso!');
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  // abrir arquivo1
  if OpenDialog1.Execute then
     File1 := OpenDialog1.FileName;

  // salvar no arquivo destino
  if SaveDialog1.execute then
     MyCopyFile(File1, SaveDialog1.FileName);
end;

end.

o procedimento é o seguinte:

abra o arquivo origem exemplo : ( Arquivo1.dat ) e depois digite um nome de arquivo para ser salvo o conteudo do Arquivo1.dat

exemplo: Teste.dat

faça isso para cada arquivo que for juntar ao arquivo Teste.dat

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

voce tem que saber qual é o tamanho maximo das linhas do arquivo .dat

Buf: array[1..2048] of Char;

o tamanho maximo definido é de 2048 caracteres .. se seu arquivo dat tiver mais do que isso voce deve mudar esse comando para 3072, ou 4096 ou 5210 ...etc para que ele possa ler todo o conteudo dessa linha

como eu disse, podia ou não funcionar corretamente

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

tentei tanto pelo nome da imagem quatno pelo índice.. mas nem um dos 2 funcionou.. tinha pensado q ele podia ter copiado sem copiar os nomes das imagens mas.. pelo visto parece q ele deixou os bits q ele tinha e passou a imagem pro cima.. não sei se isso é possível..

tentei tanto pelo nome da imagem quatno pelo índice.. mas nem um dos 2 funcionou.. tinha pensado q ele podia ter copiado sem copiar os nomes das imagens mas.. pelo visto parece q ele deixou os bits q ele tinha e passou a imagem pro cima.. não sei se isso é possível..

Não tem como deixar esse array dinâmico? porque eles crescem constantemente.. por exemplo o meu 1º aruqivo tem 15148 linhas e sei q vai crescer...

É... de qualquer forma obrigado ^^... aumentei o tamanho do Buf pra 30048 mas continuou na mesma =/

Link para o comentário
Compartilhar em outros sites

  • 0

usando array diamico

procedure MyCopyFile(FromName, ToName: string);
var
   FromF, ToF : file;
   NumRead, NumWritten : Integer;
   //Buf: array[1..2048] of Char;
   Buf: array of Char;
   Ch : Char;
begin
   AssignFile(FromF, FromName);
   Reset(FromF,1);
   AssignFile(ToF, ToName);
   Reset(ToF,1);

   Seek(ToF, FileSize(ToF));
   SetLength(Buf, FileSize(ToF));
   //ReWrite(ToF,1);
   repeat
      BlockRead(FromF, Buf, SizeOf(Buf), NumRead);
      BlockWrite(ToF, Buf, NumRead, NumWritten);
   until (NumRead = 0) or ( NumWritten <> NumRead);
   CloseFile(FromF);
   CloseFile(ToF);
   showmessage('Copia efetuada com sucesso!');
end;

OBS: arquivos .dat podem ser arquivos de texto, vídeo, imagem, etc....

dependendo do conteúdo, ele cria uma entrada no registro onde um programa especifico usa para abrir este tipo de arquivo

ao juntar 2 arquivos, o registro de entrada do outro arquivo ficará no final do primeiro... o programa que vai utiliza-lo precisa desse registro no inicio ( como se fosse um header ... cabeçalho de indice ) para poder identificar onde ele vai procurar a informação que necessita.

acho que terá que pensar em outra solução

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

É.. Meu chefe q tava faladno "tenta descobrir como q faz pra juntar 2 arquivod dat" aew fiquei matutando e sem respota... até q você me ajudou ^^. Mas então se o que você está falando for realmente o que acontece então eu teria que trabalhar com outro tipo de arquivo pois ele não consegue juntar 2 né?

Link para o comentário
Compartilhar em outros sites

  • 0

como voce observou, o programa concatena 2 arquivos .dat, mas não da maneira que voce precisa ... se o conteudo fosse arquivo texto, não teria nenhum problema

acho que voce pode usar arquivo .Res do proprio delphi para armazenar imagens ... procure no forum

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

beleza. Vlw pela dica ^^. Vou dar uma procurada muito obrigado Jhonas. Vlw mas vlw mesmo! ^^

é... acho q não vai dar muito certo.. agora q eu lembrei q usei o .Res pra fazer um compilador. Tem alguns problemas ao usar o .Res. ele funde ao exe, precisa ficar compilando. E o q eu precisava mesmo era pegar vários arquivinhos .qualquercoisa e juntar em um para ficar um .qualquercoisa grande...

Editado por LucAlucard
Link para o comentário
Compartilhar em outros sites

  • 0
Tem alguns problemas ao usar o .Res. ele funde ao exe, precisa ficar compilando.

necessariamente não... eu tenho arquivo .res com skins diferentes, bitmaps, icones etc ... so preciso carrega-los quando for preciso

exemplos:

http://www.edudelphipage.com.br/dicas_text...a=10&busca=

http://br.dir.groups.yahoo.com/group/delphi-br/message/6203

http://www.planetadelphi.com.br/artigo/41/...s-ao-executavel

OBS: Na verdade voce nem precisa compilar o arquivo .Res usando o Brcc32 , basta ir em Menu > Project > Resources

e clicar com o botão direito do mouse e clicar em New e escolher o que fara pare do arquivo de recursos

abraço

Link para o comentário
Compartilhar em outros sites

  • 0
mas isso não deixa o .exe muito pesado?

depende do tamanho das imagens

Sugestões finais:

voce pode baixar um programa para juntar arquivos dat

http://www.google.com.br/search?hl=pt-BR&a...q=&gs_rfai=

voce pode baixar esses programas feito para o delphi 5

http://kingcaio.110mb.com/Adrenaline%20Binder.zip

http://kingcaio.110mb.com/Adrenaline%20Bin...5BSource%5D.zip

http://www.4shared.com/file/KUFdn_BV/Adren...nderSource.html

ou de maneira bem simples usar esse comando

1. Digite “cmd” no menu “executar” do windows xp, para iniciar a janela de comandos (antigo DOS)

2. Digite o caminho onde estão os arquivos, por exemplo:

cd “C:\Meus Documentos\Arquivos DAT”

3. se os nomes dos arquivos forem por exemplo Arquivo1.dat, Arquivo2.dat, … etc, digite:

type Arquivo*.dat > Novo_Arquivo.dat

Este comando vai criar um arquivo novo, de nome Novo_Arquivo.dat, com as partes concatenadas

OBS: esse mesmo comando pode ser executado pelo delphi usando o comando Winexec

abraço

Link para o comentário
Compartilhar em outros sites

  • 0

nossa cara! TE AMO rsrs... Brincadera ^^'... Vlw pela ajuda. Pensei q num tinha mais como fazer isso... vou testar eles aqui ou talvez em casa e repondo o resultado postando aqui no fórum... Jhonas muitissimo obrigado pela ajuda que você ta dando pra mim cara! Brigadão de verdade!

Vou testar e posto o resultado aqui no tópico. Abração! ^^

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      651,9k
×
×
  • Criar Novo...