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 do 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údos está envolvido. Você não pode simplesmente chamar uma função e receber algo de volta.

É claro que, 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.

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

    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 ().

    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 localizado, e ele irá retornar um número que você usa nas chamadas subsequentes 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, última data de acesso, e tamanho.

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

    E se _encontre o próximo() retornos -1, que 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 de regressar de _findfirst ().

    Está tudo acabado.

Youch! Isso é meio estranho, 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.

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

#incluir #include #include #include usando namespace std-string da costeleta (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, "") -} res- retorno} vazio DumpEntry (_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 ( "../*.*", Dados) -se (ff! = -1) {int res = 0-while (res! = -1) {DumpEntry (de dados) -Res = _findnext (ff, de dados) -} _ FindClose (ff) -} retornar 0-}

Você pode ver como a Principal()segue os passos apenas esboçadas. E para cada uma das estruturas de dados, a função de 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 do diretório atual, a entrada do diretório pai, e os quatro diretórios que contêm outros exemplos):

Sun 15 de dezembro 19:40:00 20130 [.] Sun 15 de dezembro 19:40:00 20130 [..] Sun 15 de dezembro 19:40:00 20130 [deleteDirectory] Sun 15 de dezembro 19:40:00 20130 [GetDirectoryContents] Sun 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 uma pequena pouco especial, no meio da attrib membro da estrutura, como este:

Se (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 - de outra forma útil para formatar o tempo - acrescenta um retorno de carro (ou nova linha) Para o 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.

menu