Como obter o conteúdo de um diretório no c ++

Se você quiser ler o conteúdo de um diretório, você realmente vai contra o que está disponível no idioma padrão C ++. No entanto, os Souls tipo de grandes bibliotecas de C ++ (isto é, as pessoas que escreveram a maioria das bibliotecas disponíveis C ++) geralmente construídas em algumas funções úteis para obter o conteúdo de um diretório.

Um diretório geralmente contém vários arquivos, bem como outros diretórios. Obtendo uma lista de conteúdo está envolvido. Você não pode simplesmente chamar uma função e receber algo de volta.

Claro, se a biblioteca padrão C ++ incluída uma função para obter informações, provavelmente seria uma classe de modelo que contém o conteúdo do diretório. Infelizmente, a biblioteca não apoiá-lo. Em vez disso, você tem que subir através de algumas funções. Veja como ele funciona.

Video: Como resolver erro, ACESSO NEGADO Você precisará fornecer permissão de administrador

  1. Ligar _findfirst (), passando um caminho e um padrão para os arquivos cujos nomes você deseja encontrar.

    Video: Como transferir memória do drive C: para o D: ou vice-versa

    Por exemplo, passar *. * para obter todos os arquivos no diretório, ou *.TXT para obter todos os arquivos terminando em .TXT. Também passá-lo um ponteiro para uma _finddata_t estrutura.

  2. Verificar os resultados da _findfirst ().

    Video: Video Aula 4 - MS DOS - Listando conteudo do diretório como comando "DIR"

    E se _findfirst () devolvida -1, não encontrar todos os arquivos (o que significa que você está acabado). Caso contrário, ele preenche o _finddata_t estrutura com o primeiro arquivo que ele encontrou, e ele irá retornar um número que você usar em chamadas subseqüentes para as várias funções Localizar.

  3. Olhe para a _finddata_t estrutura para determinar o nome do arquivo, e outras informações, como data de criação, data do último acesso, e tamanho.

  4. Ligar _encontre o próximo() e passá-lo os seguintes valores: o número retornado de _findfirst () e o endereço de uma _finddata_t estrutura

    E se _encontre o próximo() retornos -1, ele não encontrou mais Arquivos- você pode ir para a etapa 5. Caso contrário, olhar para o _finddata_t estrutura para obter as informações para o próximo arquivo encontrado. Em seguida, repita o Passo 4.



  5. Ligar _findclose () e passá-lo o número retornado de _findfirst ().

    Você está tudo acabado.

Youch! Isso é meio bizarro, mas é a maneira como as coisas costumavam ser feito nos velhos dias de programação, antes de as línguas tradicionais desenvolveram tais características civilizadas como classes e objetos.

Video: (SOLUÇÃO) COMO REMOVER PERMISSÕES DE ARQUIVOS - QUANDO ARQUIVOS NÃO ABREM OU NÃO EXCLUEM

o GetDirectoryContents exemplo mostra como implementar isso, o processo antiquado elegante.

#incluir #include #include #include using namespace std-string Pique (string &str) {res string = str-int len ​​= str.length () - se (str [len - 1] == `R`) {res.replace (len - 1, 1, ") -} len = str.length () - se (str [len - 1] == `n`) {res.replace (len - 1, 1, ") -} return res-} DumpEntry void (_finddata_t &dados) {CreateTime string (ctime (&data.time_create)) - cout lt; lt; Costeleta (CreateTime) lt; lt; "t"-cout lt; lt; data.size lt; lt; "t"-se ((data.attrib & _A_SUBDIR) == _A_SUBDIR) {cout lt; lt; "[" lt; lt; data.name lt; lt; "]" lt; lt; endl-} else {cout lt; lt; data.name lt; lt; endl -}} int main () {_ dados int finddata_t ff = _findfirst ("../*.*", &de dados) -se (ff! = -1) {int res = 0 while (-res! = -1) {DumpEntry (dados) -Res = _findnext (FF, &dados) -} _ FindClose (ff) -} retornar 0-}

Você pode ver como a Principal()segue apenas as etapas delineadas. E para cada uma das estruturas de dados, a função chamada DumpEntry () foi usado. o DumpEntry () função imprime as informações sobre o arquivo. Aqui está o que você deve ver quando você executar o aplicativo (a entrada de diretório atual, a entrada diretório pai, e os quatro diretórios que contêm outros exemplos):

Sun 15 dez 19:40:00 20130 [.] Sol 15 dez 19:40:00 20130 [..] Sol 15 dez 19:40:00 20130 [deleteDirectory] Sol 15 dez 19:40:00 20130 [GetDirectoryContents] sol 15 de dezembro 19:40:00 20130 [MaKeDIRectory] Sun 15 de dezembro 19:40:00 20130 [RenameFile]

Note como, no DumpEntry () função, você está testando se o item é um diretório. Esta é outra maneira de idade (mas de confiança) para o programa: Verificar a presença de um minúsculo pouco particular no meio da attrib membro da estrutura, como este:

if (data.attrib & _A_SUBDIR == _A_SUBDIR) {cout lt; lt; "[" lt; lt; data.name lt; lt; "]" lt; lt; endl-}

E, finalmente, você vai notar uma função estranha incluído chamada CHOP (). Isso porque o ctime () função - caso contrário útil para formatar o tempo - acrescenta um retorno de carro (ou nova linha) Ao final da cadeia que ele cria. Então cortar isso fora. Caso contrário, a informação após a data tem que começar na próxima linha de texto, o que não era desejado.


Publicações relacionadas