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

Evitando o listdir() de acessar diretórios protegidos.


Dr. Mahala

Pergunta

Bom,tenho que reconhecer que sou iniciante em python.

Estava desenvolvendo um script que procuraria em todo o disco raiz ( C:\,por exemplo) por arquivos de uma determinada extensão.A minah iodéia é: Fazer uma espécie de procedimento recursivo,em que o programa iria buscando em cada pasta,e se houvessem pastas dentro destas pastas, buscar novamente nelas,sembre armazenado em uma lista a localização dos arquivos com a referisda extensão.Encontrei um problema: Ao pentar acessar pastas protegidas,como o 'C:\System Volume information' no Windows, o programa acusa erro.Como posso lidar com isso (lembrem-se,sou iniciante :rolleyes: )

O código segue abaixo.

# -*- coding: cp1252 -*-
import os
import string
import dircache
    
def aloca_arq(c_dir,frmt,L):
    if os.path.isdir(c_dir):
        x=os.listdir(c_dir) 
        for i in range(len(x)):
            if os.path.isfile(c_dir+x[i]) and x[i].endswith(frmt) :
                L.append(c_dir+x[i])
            if os.path.isdir(c_dir+x[i]):
                procura_(c_dir+x[i],frmt,L)
    elif not os.path.isdir(c_dir) and c_dir.endswith(frmt):
        L.append(c_dir)
        

    print L,c_dir

def procura_(pdir,frmt,L):
    ndir=os.listdir(pdir)
    for i in range(len(ndir)):
        aloca_arq(pdir+ndir[i],frmt,L)
        

def main():
    f=raw_input("Digite o formato(XXX):")
    frmt='.'+string.upper(f)
    procura_('\\',frmt,[])

if __name__ == '__main__':
    main()

Grato à todos...Um abraço!

Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

Olá, Dr. Mahala

Para isso é que existe a instrução de tratamento de erros try... except... else.. finally. No caso, se ocorrer algum erro no bloco do try, será checado qual das instruções except correspondem ao erro gerado e este bloco será executado. Opcionalmente, caso não ocorra nenhum erro, o bloco else é executado. E o bloco finally, também opcional, é sempre executado (independente de ter ocorrido erro ou não). Veja como fica o seu código com try... except... else:

# -*- coding: cp1252 -*-
import os
import string
import dircache
    
def aloca_arq(c_dir,frmt,L):
    if os.path.isdir(c_dir):
        try: #Tente
            x=os.listdir(c_dir)
        except Exception, e: #Caso ocorra erro
            print e  #Imprima a msg de erro
        else: #Caso não ocorra nenhum erro
            for i in range(len(x)):
                if os.path.isfile(c_dir+x[i]) and x[i].endswith(frmt) :
                    L.append(c_dir+x[i])
                if os.path.isdir(c_dir+x[i]):
                    procura_(c_dir+x[i],frmt,L)
    elif not os.path.isdir(c_dir) and c_dir.endswith(frmt):
        L.append(c_dir)
        

    print L,c_dir

def procura_(pdir,frmt,L):
    ndir=os.listdir(pdir)
    for i in range(len(ndir)):
        aloca_arq(pdir+ndir[i],frmt,L)
        

def main():
    f=raw_input("Digite o formato(XXX):")
    frmt='.'+string.upper(f)
    procura_('\\',frmt,[])

if __name__ == '__main__':
    main()

No caso eu coloquei para exibir a mensagem de erro, mas você pode fazer o que quiser ali dentro do except (inclusive nada, com a instrução pass). Note também que após a palavra-chave except vem a classe de erro esperada, e como Exception é a classe pai de todas as classes de erro, qualquer erro será captado ali.

Certo? ;)

Graymalkin

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,1k
    • Posts
      651,8k
×
×
  • Criar Novo...