Saber se um diretorio existe?

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
Bisteca
Usuário Nível 2
Usuário Nível 2
Mensagens: 74
Registrado em: 10 Jan 2005 10:25

Saber se um diretorio existe?

Mensagem por Bisteca »

Bom dia amigos...
Gostaria de saber como faço para saber se um diretorio existe ou não.
Ah. o diretorio esta vazio (sem arquivos), ja tentei "If file..."mas nao deu certo.

E tambem algum comando para copiar arquivos sem ser pelo RUN.

Obrigado a todos
Lopes
Usuário Nível 1
Usuário Nível 1
Mensagens: 22
Registrado em: 12 Dez 2005 16:27

Mensagem por Lopes »

Em meus sitemas costumo usar os seguintes processos para checar se o diretório existe:

Código: Selecionar todos

// Verifica se possui o diretorio de backup
VetDir := Directory(DIR_FIL+"*.","D")
If (nEnc   := aScan(VetDir,{|x| x[1] == "BACK" .and. x[5] = "D"})) = 0
   //Run("MD "+DIR_FIL+"BACK >>NUL")
   MakeDir(DIR_FIL+"BACK")
EndIf
DIR_FIL no caso é uma varíavel que uso para guardar o caminho onde está o sistema.
Grings
Usuário Nível 3
Usuário Nível 3
Mensagens: 340
Registrado em: 18 Ago 2004 13:51

Mensagem por Grings »

If File(´C:\Diretorio\NUL´)
Alert(´Diretório existente...´)
Else
Alert(´Diretório não existente...´)
EndIf
Avatar do usuário
Bisteca
Usuário Nível 2
Usuário Nível 2
Mensagens: 74
Registrado em: 10 Jan 2005 10:25

diretorio

Mensagem por Bisteca »

Obrigado a todos

Valuezaço
spereira
Usuário Nível 2
Usuário Nível 2
Mensagens: 85
Registrado em: 19 Jul 2004 11:42
Localização: Porto - Portugal

Mensagem por spereira »

Eu utilizo o seguinte:

if cd("\diretorio")
? "diretório existe"
else
? "diretório não existe"
endif
Avatar do usuário
Augusto
Usuário Nível 3
Usuário Nível 3
Mensagens: 473
Registrado em: 26 Ago 2003 17:50
Localização: Maricá/RJ
Contato:

Mensagem por Augusto »

Bisteca... respondendo a sua 2a. pergunta... (cópia de arquivo)

COPY TO <nome do arquivo cópia>
[<escopo>]
[FIELDS <lista de campos>]
[FOR <condição>]
[WHILE <condição>]
[SDF/DELIMITED [WITH <delimitador>]]

O comando COPY TO duplica todo ou parte do arquivo de dados ativo (em uso) para um novo arquivo. Este comando é também o principal comando para a geração de arquivos de dados de outros formatos que não os utilizados pelo Clipper.
Através do comando COPY TO, todos os registros, incluindo aqueles marcados para deleção, são copiados para o novo arquivo, a menos que seja especificado um escopo ou condições através das clausulas FOR e WHILE, ou se o comando SET DELETED estiver ON. Se um filtro estiver ativo, através do comando SET FILTER, apenas os registros que passarem pelo filtro serão copiados para o novo arquivo.

Ou ainda...

COPY FILE <nome do arquivo origem> TO <nome do arquivo destino>

O comando COPY FILE cria uma cópia duplicata de qualquer tipo de arquivo, mesmo arquivos não pertencentes ao Clipper. Tanto o nome do arquivo origem quanto o do arquivo destino devem incluir sua extensão, a designação do acionador de discos (drive) e do diretório onde eles estão localizados, caso não seja utilizado o acionador e o diretório serão considerados o padrão.
Um arquivo de dados que estiver ativo (em uso) não poderá ser copiado através do comando COPY FILE.
:xau Fui...
goulart@provsul.com.br

Faça da PROVSUL o seu Provedor de Serviços WEB
Visite: www.PROVSUL.com.br
ROMARIO
Usuário Nível 1
Usuário Nível 1
Mensagens: 35
Registrado em: 06 Jul 2004 11:25
Localização: AGUDO - RS

Mensagem por ROMARIO »

Caros.

Tambem precisava de fazer teste se o diretório existe. Testei o exemplo do Grings que funcionou perfeitamente. Também funciona substituindo o "\null" por "\*.*". Fiz testes inclusive com subdiretórios:
If file("C:\diretorio\subdiretorio\*.*") etc. também funciona.

O exemplo do Spereira If cd("c:\diretorio") dá erro. "cd" não é comando ou função do clipper.

Abraços

Romario
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem por rochinha »

Amiguinhos

Voce podem usar as funçòes de baixo nivel para isto:

function IsDirExist( onde )
errhandle = fcreate(onde+"\$$$.$$$")
return iif( fError()=0, .t., .f. )

...
if .not. IsDirExist( "c:\rochinha" )
? "Diretorio nao existe."
endif
...

@braços :?)
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
spereira
Usuário Nível 2
Usuário Nível 2
Mensagens: 85
Registrado em: 19 Jul 2004 11:42
Localização: Porto - Portugal

Mensagem por spereira »

ROMARIO escreveu:Caros.

Tambem precisava de fazer teste se o diretório existe. Testei o exemplo do Grings que funcionou perfeitamente. Também funciona substituindo o "\null" por "\*.*". Fiz testes inclusive com subdiretórios:
If file("C:\diretorio\subdiretorio\*.*") etc. também funciona.

O exemplo do Spereira If cd("c:\diretorio") dá erro. "cd" não é comando ou função do clipper.

Abraços

Romario
Desculpem pois não indiquei a biblioteca que utilizo e que contém a função CD(). É a CMOUSE.LIB.
Não sei de onde vem esta biblioteca nem quem a fez, pois já existia aquí no meu trabalho. Se alguém souber por favor nos informe.

Abraços.
Avatar do usuário
Netavin
Usuário Nível 3
Usuário Nível 3
Mensagens: 306
Registrado em: 28 Fev 2007 08:37
Localização: Cacoal-RO

Makedir()

Mensagem por Netavin »

... obrigado a todos que contribuíram para a solução do problema em questão.
Quero reforçar meu comentário em expedientes anteriores: Este Fórum é demais!!

[]´s

Netavin.
TK90 / TK95 / APPLE IIe / 286 / 386 / 486 / 586 / AMD Atlhon
" Sem saber que era impossível, foi lá e fez !! "
ABeltrani
Usuário Nível 2
Usuário Nível 2
Mensagens: 54
Registrado em: 09 Nov 2007 10:05
Localização: Porto Ferreira-SP

Mensagem por ABeltrani »

Boa tarde !

Se ajudar, esta função verifica a existencia de um diretorio. Se o mesmo não existir, ela cria o diretorio. É uma função da CATools.

Código: Selecionar todos

func verdir(diretorio)
loca erro:=dirchange(diskname()+':'+diretorio)
if erro=0
   dirchange('..')
elseif erro=-3
   dirmake(diskname()+':'+diretorio)
else
   mens('Erro inesperado.')
   retu .f.
endi
retu .t.
Espero ter ajudado.
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem por rochinha »

Amiguinho

Em relação a sua função seria melhor que ela aceitasse mais um parametro onde fosse possivel indicar TRUE ou FALSE para criar ou não o diretorio caso o usuario quizesse.

Imagine que eu apenas queira saber se a mesma existe, sendo que eu quero que ele não exista, sua função irá sempre retornar TRUE.

Pense nesta função como a função FILE() se o arquivo existe, TRUE, senão FALSE. E então se decide usar as funções de criação.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Mensagem por gvc »

O dirchange já retorna erros se não encontrar a pasta.
Só tem o efeito colateral de mudar o ponteiro para a pasta, se ela for encontrada.
"TRS-80/Sincler/Apple/PC - Clipper Winter 85, tlink 1.0 [pc 10 MHz - 640K] {NEZ 8000 2Kb RAM}"
{POG - Programação Orientada a Gambiarra}
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Verificação garantida de determinado diretório

Mensagem por Pablo César »

Na minha opinião o uso da DIRCHANGE seria a DIRMAKE caso queira criar a pasta quando não existir e caso exista simplesmente retorna valor maior que zero e não causará nenhuma situação que não se queira ter. Ainda mais eu acho que se há necessidade de saber se existe determinada pasta, seria justamente para armazenar algo, não é assim ?. Então por quê não garantir criando-la sempre que puder.

Alias em tempo, devo dizer que não funciona (da forma que está) os exemplos abaixo:

Código: Selecionar todos

If File("C:\XIS\NUL")
   ? "Diretório existente..."
Else 
   ? "Diretório não existente..."
EndIf
e também este, como disse o colega:

Código: Selecionar todos

If File("C:\XIS\*.*")
   ? "Diretório existente..."
Else 
   ? "Diretório não existente..."
EndIf
Se for para simplesmente verificar se existe e não criar a pasta, eu ficaria com o do Netavin e do Rochinha, pois este sim funciona adequadamente, desta forma:

Código: Selecionar todos

VetDir := Directory("C:\*.","D")
If aScan(VetDir,{|x| x[1] == "XIS" .and. x[5] = "D"})= 0
   ? "Diretório não existente..."
Else 
   ? "Diretório existente..."
EndIf

Código: Selecionar todos

if IsDirExist( "c:\XIS" )
   ? "Diretorio existente."
else
   ? "Diretorio nao existe."
endif 
 
function IsDirExist( onde ) 
errhandle = fcreate(onde+"\$$$.$$$") 
if file(onde+"\$$$.$$$")
   delete file(onde+"\$$$.$$$")
endif
return iif( fError()=0, .t., .f. )


Preferivelmente ficaria com o exemplo do Rochinha, pois demandaria menos ação de procedimento, imagine se é um HD onde tem muitos diretório e arquivos (haveria uma limitação com o uso do DIRECTORY).
Editado pela última vez por Pablo César em 07 Dez 2007 19:47, em um total de 2 vezes.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Mensagem por rochinha »

Amiguinho

Então ela deveria ser assim:

Código: Selecionar todos

func verdir(diretorio) 
   loca erro:=dirchange(diretorio) 
   if erro <> 0 
      return .f.
   endif
   return .t. 
Ou:

Código: Selecionar todos

func verdir(diretorio,lCria) 
   loca erro:=dirchange(diretorio) 
   if erro <> 0 
      if lCria .and. erro = -3
         dirmake(diretorio)
         return .t. 
      endif
      return .f.
   endif
   return .t. 
Tenho pra mim que DiskName() retorna a letra do drive atual e portanto se eu necessitar verificar outra unidade as funções não funcionariam, certo?
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Responder