Página 1 de 2

Saber se um diretorio existe?

Enviado: 24 Fev 2006 10:18
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

Enviado: 24 Fev 2006 10:41
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.

Enviado: 24 Fev 2006 11:46
por Grings
If File(´C:\Diretorio\NUL´)
Alert(´Diretório existente...´)
Else
Alert(´Diretório não existente...´)
EndIf

diretorio

Enviado: 24 Fev 2006 14:22
por Bisteca
Obrigado a todos

Valuezaço

Enviado: 26 Fev 2006 12:30
por spereira
Eu utilizo o seguinte:

if cd("\diretorio")
? "diretório existe"
else
? "diretório não existe"
endif

Enviado: 27 Fev 2006 12:04
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.

Enviado: 28 Fev 2006 15:58
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

Enviado: 28 Fev 2006 18:54
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 :?)

Enviado: 03 Mar 2006 08:32
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.

Makedir()

Enviado: 07 Dez 2007 12:59
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.

Enviado: 07 Dez 2007 13:27
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.

Enviado: 07 Dez 2007 13:54
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.

Enviado: 07 Dez 2007 14:54
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.

Verificação garantida de determinado diretório

Enviado: 07 Dez 2007 19:12
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).

Enviado: 07 Dez 2007 19:24
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?