Curinga para procurar arquivos

19/06/2008

23

Tenho em um diretório, um arquivo que só é conhecida a sua extensão. Como faço
para obter o arquivo ou o nome dele, passano o diretório e a extensão ou só o diretório?
Para cada computador, haverá um arquivo com nome diferente e tenho que fazer uma
única aplicação. É conhecida apenas a extensão, pois todos serão gerados com a mesma
extensão e o diretório, já que todos estrão sempre lá. Somente o nome é que varia de ECF
para ECF. Esse arquivo é o serial do ECF, razão pela qual cada ECF terá o seu próprio.


Responder

Posts

19/06/2008

Antseralves

Você pode usar as funções FindFirst,FinsNext do Delphi pra isso.
Veja no HELP.


Responder

19/06/2008

Paulo

Colega, acho q vc não entendeu a pergunta. Eu preciso carregar de um diretório, uma arquivo que não sei o nome, mas sei a extensão. Digamos assim: No meu diretório eu tenho um arquivo assim:
C:\Teste\tt.mfd. Como eu não sei o nome do arquivo(tt) mas sei a extensão, preciso carregar na minha função esse arquivo como parâmetro, algo tipo assim:

CarregaArquivo(1,Path_do_arquivo_e_nome_c_extensão,0);

Isto ´Path_do_arquivo_e_nome_c_extensão´ é o meu arquivo. Para saber um diretório e o arquivo tal, eu uso FileExists(), mas isso eu teria que informar o nome do arquivo e extensão. Quero quase isso, exceto o nome do arquivo, tipo *.MFD. Esse curinga ´*.´ é que eu quero implementar.


Responder

19/06/2008

Antseralves

É isso aí. A função FindFirst pode seu usada para pegar o primeiro
arquivo de uma pasta qualquer que tenha o nome (ou extensão)
informado. Por exemplo *.MFD. Aí você pode pegar o nome desse
arquivo encontrado e fazer o que quiser com ele. Depois você poderá
usar o FindNext para pesquisar se existem mais arquivos com a mesma
extensão. No fim não esquecer de dar um FindClose. Tem tudo no HELP
do Delphi.


Responder

25/06/2008

Paulo

O que eu passo no parametro TSearchRec dessa função? Já tentei, 0,1,faAnyFile e sempre dá erro.


Responder

25/06/2008

Antseralves

Abra uma nova aplicação e coloque no form um TButton, um
TDirectoryOutline (Samples) e um TListBox.

No click do botão escreva.

[b:266470fadf]
procedure TForm1.Button1Click(Sender: TObject);

var S : TSearchRec;
Pasta : string;

begin
ListBox1.Clear;
ShowMessage(DirectoryOutline1.Directory);
if FindFirst(DirectoryOutline1.Directory+´\*.*´,faAnyFile,S) = 0 then
repeat
ListBox1.Items.Add(S.Name);
until FindNext(S) <> 0;
FindClose(S);
end;[/b:266470fadf]

Isso exibirá no ListBox todos os arquivos (*.*) da pasta selecionada no
DirectoryOutline.


Responder

25/06/2008

Antseralves

Obs: O ShowMessage não é necessário...


Responder

25/06/2008

Paulo

Acho que não estou me fazendo entender. Não é isso que eu quero, mas agradeço de antemão. Vou explicar melhor minha dúvida.
Preciso passar por parâmetro de uma função, um determinado arquivo. Hoje em teste passo assim:
SWEDA_ReproduzirFitaDetalhe(PathOrig,PathDest,dtIni.Text,dtFim.Text,0)

Onde:PathOrig >> Diretorio + Arquivo Binário
PathDest >> Diretorio + Arquivo.TXT
os demais são data e um valor default da SWEDA
No PathOrig, eu carrego assim:
PathOrig := C:\Sweda\SW010500000000000232\SW010500000000000300.MFD´

Este carregamento do arquivo binário, é que eu não posso setar na mão, como fiz acima, pois para cada ECF ele terá um nome diferente(Numero de Serie do ECF). Então, preciso fazer uma busca na pasta SWEDA(Ela é fixa), e achar o arquivo binário e carregar no meu parâmetro da função ou numa variável. No meu exemplo eu carrego na mão, pois estou testando ainda, mas preciso colocar em produção.


Responder

25/06/2008

Antseralves

Usando a sua rotina...


procedure TForm1.Button1Click(Sender: TObject);

var S : TSearchRec;
PathOrigem,PathDestino : string;

begin
PathOrig := C:\Sweda\SW010500000000000232´;
PathDestino := ´<nome da pasta destino>´;

// O FindFirst abaixo pega o PRIMEIRO arquivo com extensão .MDF
// que está na pasta ´C:\Sweda\SW010500000000000232
// Estou supondo que pode haver mais de um !

if FindFirst(PathOrigem+´\*.MDF´,faAnyFile,S) = 0 then
repeat

// Se encontrou então o nome do arquivo
// encontrado (SW010500000000000300.MFD por exemplo)
// estará Em S.Name. Chama a função com o nome encontrado.

SWEDA_ReproduzirFitaDetalhe (PathOrig+´\S.Name´,PathDest,dtIni.Text,dtFim.Text,0);

until FindNext(S) <> 0; // Verifica se existe mais algum arquivo
// com extensão .MDF

FindClose(S); // No final dá o FindClose
end;

Desculpe se continuo não entendendo mas pelo menos tentei !!


Responder

25/06/2008

Antseralves

Em tempo... se você não sabe o nome das subpastas de Sweda
então faz primeiro uma pesquisa para pegar as subpastas
e então chama uma rotina que trata só os arquivos das mesmas.


procedure TForm1.Button1Click(Sender: TObject);

var S : TSearchRec;
PathOrigem : string;

begin
PathOrig := C:\Sweda´;
// Aqui só vai procurar as pastas de Sweda
if FindFirst(PathOrigem+´\*.*´,faDirectory,S) = 0 then
repeat

// Se tem pasta então vai pesquisar os
// arquivos .MDF da mesma

ProcuraNaPasta(PathOrigem+´\´+S.Name);
until FindNext(S) <> 0;
FindClose(S);
end;

procedure TForm1.ProcuraNaPasta(Pasta: string);

var S : TSearchRec;
PathDestino : string;

begin
PathDestino := ´<nome da pasta destino>´;

// O FindFirst abaixo pega o PRIMEIRO arquivo com extensão .MDF
// que está na pasta ´C:\Sweda\<nome da subpasta>
// Estou supondo que pode haver mais de um !

if FindFirst(PathOrigem+´\*.MDF´,faAnyFile,S) = 0 then
repeat

// Se encontrou então o nome do arquivo
// encontrado (SW010500000000000300.MFD por exemplo)
// estará Em S.Name. Chama a função com o nome encontrado.

SWEDA_ReproduzirFitaDetalhe(PathOrig+´\S.Name´,PathDest,dtIni.Text,dtFim.Text,0);

until FindNext(S) <> 0; // Verifica se existe mais algum arquivo com extensão .MDF

FindClose(S); // No final dá o FindClose
end;


Responder

26/06/2008

Paulo

Ok, antseralves, acho que entendi trabalhar o FindFirst. Vou fazer assim, e posto o resultado aqui. Valeu pela paciência e disponibilidade. Valeu mesmo!!!


Responder

26/06/2008

Paulo

Resolvi dessa forma. Claro agora vou melhorar isso aí, mas está funcionando como eu gostaria.

var S : TSearchRec; PathMatriz, PathOrigem, PathDestino: string; ListaDir: TStringList; begin ListaDir := TStringList.Create; PathMatriz := ´C:\Sweda´; PathDestino := ´C:\Sistema\Teste.txt´; if FindFirst(PathMatriz+´\*.*´,faDirectory,s) = 0 then repeat if ((s.Attr and faDirectory)<>0) and (s.Name<>´.´) and (s.Name<>´..´) then ListaDir.Add(s.Name); until FindNext(s) <> 0; FindClose(s); PathOrigem := PathMatriz + ´\´ + s.name+ ´\´; if FindFirst(PathOrigem+´\*.MFD´,faAnyFile,s) = 0 then PathOrigem := PathOrigem + s.name; FindClose(s); if (dtIni.Text <> ´ / / ´)and(dtFim.Text <> ´ / / ´) then SWEDA_ReproduzirFitaDetalhe(PathOrigem,PathDestino,dtIni.Text,dtFim.Text,0) else MessageDlg(´Data Inválida ou Vazia´,mtInformation,[mbOk],0); end;



Responder

26/06/2008

Paulo

Encontrei a cura, mas tem uma questão: Caso no Dir mãe Sweda houver mais de um diretório, o que eu faço? O Arquivo ele vai estar somente em um diretório criado pelo ECF. Já tentei buscar o arquivo, passando somente o Dir mãe, mas não me trouxe nada. Talvez eu não soube fazer certo.


Responder
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira