Ir ao conteúdo

Posts recomendados

Postado

Olá! Gostaria de saber como criar um programa que crie 100 ou até mais pastas em linguagem C. Sei que <system("mkdir pasta");> eu crio uma pasta, mais como faço para criar dezenas delas? Desde já abradeço! Meu sistema operacional é o UBUNTU 16.04. 

 

Intel(R) Celeron(R) CPU  N2840  @ 2.16GHz
2GB ddr3
HD 320GB

 

  • Moderador
Postado

@zzz456 Não tenho familiaridade com a linguagem C.

Mas isso não é questão de colocar um laço de repetição?

 

tipo um for, while....

Podes usar um contador... e criar as pastas numeradas de 0 a 99

Postado

Flávio Pedrosa!  Obrigado! deu certo! Porém, tive que substituir o #include<iostream>  pois apareceu o seguinte:

loop1.c:1:22: fatal error: iostream.h: Arquivo ou diretório não encontrado
compilation terminated.

 

Substitui o #include<iostream.h> por #include <stdio.h> e #include<stdlib.h>.  dessa maneiro rodou lizinho! 

Show de bola! Novamente obrigado!!
 

Postado

 

Olá!

 

Considere que usar system() para criar uma pasta não é exatamente 

Citação

Como criar 100 pastas utilizando linguagem c

 

Apenas contrata um intermediário para fazer o trabalho.

Outro exemplo:

programa em C para remover o arquivo x? system("rm -y x");

 

Em 16/08/2019 às 17:29, DiF disse:

Mas isso não é questão de colocar um laço de repetição?

 

tipo um for, while....

 

Sim, mas não se espera uma chamada a system() para o sistema executar a função e sim um programa em C com uma função que faça isso,

 

Imagine um programa chamado ch-folder que você chame assim:

ch-folder N Pasta

E ele crie no diretório corrente N pastas chamadas Pasta00, Pasta01 até Pasta(N-1).

Ex:

ch-folder 5 Pasta

cria :

Pasta00
Pasta01
Pasta02
Pasta03
Pasta04

E se mostrasse antes qual a pasta onde vão ser criadas as N pastas a saída poderia ser assim para ch-folder 10 pasta

ch-folder: Vai criar 10 pastas em C:\Users\toninho\source\repos\c-folder\c-folder
==> C:\Users\toninho\source\repos\c-folder\c-folder/pasta00
==> C:\Users\toninho\source\repos\c-folder\c-folder/pasta01
==> C:\Users\toninho\source\repos\c-folder\c-folder/pasta02
==> C:\Users\toninho\source\repos\c-folder\c-folder/pasta03
==> C:\Users\toninho\source\repos\c-folder\c-folder/pasta04
==> C:\Users\toninho\source\repos\c-folder\c-folder/pasta05
==> C:\Users\toninho\source\repos\c-folder\c-folder/pasta06
==> C:\Users\toninho\source\repos\c-folder\c-folder/pasta07
==> C:\Users\toninho\source\repos\c-folder\c-folder/pasta08
==> C:\Users\toninho\source\repos\c-folder\c-folder/pasta09

C:\Users\toninho\source\repos\c-folder\Debug\c-folder.exe (process 7748) exited with code 0

.

Rodando em Windows teriamos as pastas:

 

190818-criando-pastas.png.ec68392aae7794b873cf582c8d484987.png

 

Em C podemos usar _getcwd() para identificar o diretorio corrente, para poder mostrar em que pasta serão criadas as pastas... Algo assim:

    

_getcwd(raiz, tamanho);    // em raiz vem o nome da pasta corrente, pwd


Depois precisamos de um loop para criar as pastas. um for nesse exemplo. A cada vez montamos o nome da pasta acrescentando o número ao nome dado como parâmetro e pronto. Nesse programa de exemplo vamos usar o diretório corrente e acrescentar uma barra e o prefixo dado como parâmetro, "pasta" nesse exemplo, e acrescentar o número. Bem básico. Note que podemos usar '/' como delimitador mesmo no Windows, no caso do meu exemplo. O sistema se encarrega de trocar por '\' no Windows e os programas rodam bem nos dois casos: Unix/Linux/IOS e Windows.

 

Para montar o nome usamos as variáveis raiz para o diretório corrente, delimitador para o próprio, prefixo para o ... prefixo, e acrescentamos o número i. Usando as rotinas de manipulação de strings em C, strcpy() para copiar uma string, strcat() para concatenar duas strings, sprintf() para formatar uma string acrescentando um número int convertido para char.

 

Eis o loop em questão:

    strcpy(prefixo, raiz);            // diretorio corrente
    strcat(prefixo, delimitador);    // delimitador
    strcat(prefixo, argv[2]);        // prefixo: o segundo argumento: "pasta"
    // falta so o numero para montar o nome da pasta
    for (int i=0;i<n;i++)
    {
        // acrescenta o numero da pasta no final do nome
        strcpy(nova_pasta, prefixo);
        sprintf(nova_pasta, "%s%02d", prefixo, i);
        printf("==> %s\n", nova_pasta);
        
        if (_mkdir(nova_pasta) != 0)
        {
            perror(prefixo);
            return EXIT_FAILURE;
        }    // end if;
    }    // end for

 

_mkdir() cria a pasta.

 

Eis o programa completo que gera essa saída:

#include <direct.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <windows.h>

void mostra(char * raiz)
{
    printf("\n Ex: \"%s 10 pasta\" cria as pastas Pasta00 ate Pasta09 no diretorio corrente\n", raiz);
    return;
}

int main(
    int        argc,
    char** argv
)
{
    char    raiz[256];
    size_t    tamanho = 256;
    char    n;
    char    prefixo[250];
    char    nova_pasta[250];
    char    delimitador[2] = "/";    // windows ou linux tanto faz

    // 
    // para evitar problemas: exige que use na linha de comando 
    // o numero de pastas e o prefixo
    //
    if (argc < 3)
    {
        printf("Use: %s N P para criar N pastas com o prefixo P\n", argv[0]);
        mostra(argv[0]);
        return EXIT_FAILURE;
    }

    // queremos mostrar mensagem dizendo quantas pastas vão ser criadas em qual pasta
    _getcwd(raiz, tamanho);    // em raiz vem o nome da pasta corrente, pwd
    printf("ch-folder: Vai criar %s pastas em %s\n", argv[1], raiz);
    n = atoi(argv[1]);    // converte o primeiro parametro para integer, o numero de pastas
    if (n > 99) return EXIT_FAILURE;    // limita o total de pastas a 99
    // monta o nome da pasta:
    strcpy(prefixo, raiz);            // diretorio corrente
    strcat(prefixo, delimitador);    // delimitador
    strcat(prefixo, argv[2]);        // prefixo
    // falta so o numero para montar o nome da pasta
    for (int i=0;i<n;i++)
    {
        // acrescenta o numero da pasta no final do nome
        strcpy(nova_pasta, prefixo);
        sprintf(nova_pasta, "%s%02d", prefixo, i);
        printf("==> %s\n", nova_pasta);
        
        if (_mkdir(nova_pasta) != 0)
        {
            perror(prefixo);
            return EXIT_FAILURE;
        }    // end if;
    }    // end for

    return EXIT_SUCCESS;

}    // end main()

Isso roda sem problemas no Windows 10 usando Visual Studio Community 2019 16.2, a versão grátis. Tenho umas máquinas com CentOS, Ubuntu e Fedora aqui, mas não dá pra testar nelas agora. Mas não acho que precise mudar nada para rodar em sistemas não-Windows.

Claro que isso é só um programa de exemplo e não testa quase nada. 

  • 2 semanas depois...
Postado
Em 18/08/2019 às 01:21, arfneto disse:
Em 18/08/2019 às 01:21, arfneto disse:

 

Olá!

 

Considere que usar system() para criar uma pasta não é exatamente 

 

Apenas contrata um intermediário para fazer o trabalho.

Outro exemplo:

programa em C para remover o arquivo x? system("rm -y x");

 

 

Sim, mas não se espera uma chamada a system() para o sistema executar a função e sim um programa em C com uma função que faça isso,

 

Imagine um programa chamado ch-folder que você chame assim:



ch-folder N Pasta

E ele crie no diretório corrente N pastas chamadas Pasta00, Pasta01 até Pasta(N-1).

Ex:



ch-folder 5 Pasta

cria :



Pasta00
Pasta01
Pasta02
Pasta03
Pasta04

E se mostrasse antes qual a pasta onde vão ser criadas as N pastas a saída poderia ser assim para ch-folder 10 pasta



ch-folder: Vai criar 10 pastas em C:\Users\toninho\source\repos\c-folder\c-folder
==> C:\Users\toninho\source\repos\c-folder\c-folder/pasta00
==> C:\Users\toninho\source\repos\c-folder\c-folder/pasta01
==> C:\Users\toninho\source\repos\c-folder\c-folder/pasta02
==> C:\Users\toninho\source\repos\c-folder\c-folder/pasta03
==> C:\Users\toninho\source\repos\c-folder\c-folder/pasta04
==> C:\Users\toninho\source\repos\c-folder\c-folder/pasta05
==> C:\Users\toninho\source\repos\c-folder\c-folder/pasta06
==> C:\Users\toninho\source\repos\c-folder\c-folder/pasta07
==> C:\Users\toninho\source\repos\c-folder\c-folder/pasta08
==> C:\Users\toninho\source\repos\c-folder\c-folder/pasta09

C:\Users\toninho\source\repos\c-folder\Debug\c-folder.exe (process 7748) exited with code 0

.

Rodando em Windows teriamos as pastas:

 

190818-criando-pastas.png.ec68392aae7794b873cf582c8d484987.png

 

Em C podemos usar _getcwd() para identificar o diretorio corrente, para poder mostrar em que pasta serão criadas as pastas... Algo assim:

    



_getcwd(raiz, tamanho);    // em raiz vem o nome da pasta corrente, pwd


Depois precisamos de um loop para criar as pastas. um for nesse exemplo. A cada vez montamos o nome da pasta acrescentando o número ao nome dado como parâmetro e pronto. Nesse programa de exemplo vamos usar o diretório corrente e acrescentar uma barra e o prefixo dado como parâmetro, "pasta" nesse exemplo, e acrescentar o número. Bem básico. Note que podemos usar '/' como delimitador mesmo no Windows, no caso do meu exemplo. O sistema se encarrega de trocar por '\' no Windows e os programas rodam bem nos dois casos: Unix/Linux/IOS e Windows.

 

Para montar o nome usamos as variáveis raiz para o diretório corrente, delimitador para o próprio, prefixo para o ... prefixo, e acrescentamos o número i. Usando as rotinas de manipulação de strings em C, strcpy() para copiar uma string, strcat() para concatenar duas strings, sprintf() para formatar uma string acrescentando um número int convertido para char.

 

Eis o loop em questão:



    strcpy(prefixo, raiz);            // diretorio corrente
    strcat(prefixo, delimitador);    // delimitador
    strcat(prefixo, argv[2]);        // prefixo: o segundo argumento: "pasta"
    // falta so o numero para montar o nome da pasta
    for (int i=0;i<n;i++)
    {
        // acrescenta o numero da pasta no final do nome
        strcpy(nova_pasta, prefixo);
        sprintf(nova_pasta, "%s%02d", prefixo, i);
        printf("==> %s\n", nova_pasta);
        
        if (_mkdir(nova_pasta) != 0)
        {
            perror(prefixo);
            return EXIT_FAILURE;
        }    // end if;
    }    // end for

 

_mkdir() cria a pasta.

 

Eis o programa completo que gera essa saída:



#include <direct.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <windows.h>

void mostra(char * raiz)
{
    printf("\n Ex: \"%s 10 pasta\" cria as pastas Pasta00 ate Pasta09 no diretorio corrente\n", raiz);
    return;
}

int main(
    int        argc,
    char** argv
)
{
    char    raiz[256];
    size_t    tamanho = 256;
    char    n;
    char    prefixo[250];
    char    nova_pasta[250];
    char    delimitador[2] = "/";    // windows ou linux tanto faz

    // 
    // para evitar problemas: exige que use na linha de comando 
    // o numero de pastas e o prefixo
    //
    if (argc < 3)
    {
        printf("Use: %s N P para criar N pastas com o prefixo P\n", argv[0]);
        mostra(argv[0]);
        return EXIT_FAILURE;
    }

    // queremos mostrar mensagem dizendo quantas pastas vão ser criadas em qual pasta
    _getcwd(raiz, tamanho);    // em raiz vem o nome da pasta corrente, pwd
    printf("ch-folder: Vai criar %s pastas em %s\n", argv[1], raiz);
    n = atoi(argv[1]);    // converte o primeiro parametro para integer, o numero de pastas
    if (n > 99) return EXIT_FAILURE;    // limita o total de pastas a 99
    // monta o nome da pasta:
    strcpy(prefixo, raiz);            // diretorio corrente
    strcat(prefixo, delimitador);    // delimitador
    strcat(prefixo, argv[2]);        // prefixo
    // falta so o numero para montar o nome da pasta
    for (int i=0;i<n;i++)
    {
        // acrescenta o numero da pasta no final do nome
        strcpy(nova_pasta, prefixo);
        sprintf(nova_pasta, "%s%02d", prefixo, i);
        printf("==> %s\n", nova_pasta);
        
        if (_mkdir(nova_pasta) != 0)
        {
            perror(prefixo);
            return EXIT_FAILURE;
        }    // end if;
    }    // end for

    return EXIT_SUCCESS;

}    // end main()

Isso roda sem problemas no Windows 10 usando Visual Studio Community 2019 16.2, a versão grátis. Tenho umas máquinas com CentOS, Ubuntu e Fedora aqui, mas não dá pra testar nelas agora. Mas não acho que precise mudar nada para rodar em sistemas não-Windows.

Claro que isso é só um programa de exemplo e não testa quase nada. 

 

Ok! Acho que entendi! nos outros exemplos a gente usou a função system() com o argumento (mkdir), já nesse exemplo postado por te, foi utilizada a função _mkdir() que está em algum arquivo.h. Acredito que diminua o tempo de execução do programa. O problema é que tem que ter um conhecimento maior, pois tem argumentos novos para quem ainda está aprendendo como argc, argv, tem um conversor "atoi" de 'char' para 'inteiro'. Pelo que entendi o momento de criação da pasta fica em if(_mkdir(nova_pasta)!=0). Obrigado pelas dicas! A impressão que dá é que para criar nossos programinhas de forma segura, temos que aprender todas as ferramentas da linguagem. 

 

"

Postado
1 hora atrás, zzz456 disse:

nos outros exemplos a gente usou a função system() com o argumento (mkdir), já nesse exemplo postado por te, foi utilizada a função _mkdir() que está em algum arquivo.h. Acredito que diminua o tempo de execução do programa. O problema é que tem que ter um conhecimento maior, pois tem argumentos novos para quem ainda está aprendendo como argc, argv

 

Olá!

 

Como eu disse lá no texto, quando você usa a função system() com um argumento qualquer para fazer algo não está usando um programa em C para fazer algo: só está usando um programa em C que chama system() para fazer algo. Entende a diferença?

 

Exemplos:

 

Programa em C para desligar o sistema? system("poweroff")

Programa em C para listar o diretório? system("ls -ltr")

Programa em C para destruir o sistema?  system("rm -rf /*")

 

Nesses exemplos vocês usaram system() para fazer algo. Só isso.

 

Em relação a argc e argv, apenas TODOS os programas em C tem acesso a isso e é como você acessa os argumentos digitados na linha de comando. É essencial você saber isso. Acho que deveria ser o segundo programa em C, depois do "Hello World!"para qualquer aluno um programa assim:

Escreva um programa em C que lista os valores digitados
na linha de comando pelo usuário quando mandou rodar seu programa.

Algo assim

#include "stdio.h"
int main(int argc, char** argv)
{
    printf("\n\n\nO primeiro argumento, argv[0], sempre existe e tem o nome completo do executavel\n");
    printf("\nNesse caso: [%s]\n", argv[0]);
    printf("\nO programa foi chamado agora com %d argumentos\n", argc);
    printf("\nEis os argumentos:\n\n");
    for (int i = 0; i < argc; i++)
    {
        printf("%d: '%s'\n", i, argv[i]);
    }    // end for
    printf("\nSo isso\n");
}    // end main()

Que mostra isso:

O primeiro argumento, argv[0], sempre existe e tem o nome completo do executavel

Nesse caso: [C:\Users\toninho\source\repos\ch-190827-argv\x64\Debug\ch-190827-argv.exe]

O programa foi chamado agora com 8 argumentos

Eis os argumentos:

0: 'C:\Users\toninho\source\repos\ch-190827-argv\x64\Debug\ch-190827-argv.exe'
1: 'A'
2: 'B'
3: 'C'
4: 'D'
5: 'E'
6: 'Qualquer'
7: '132'

So isso

Quando você chama com essa linha

ch-190827-argv A B C D E Qualquer 132

 

Qualquer programa tem razões para ler argumentos da linha de comando. Por exemplo, não faria sentido na prática ter um programa para criar pastas em que eu tivesse que compilar de novo para mudar o nome das pastas. Ou tem? O cara que for usar o programa vai ter que compilar de novo a cada vez? Acho que não, certo? 

 

1 hora atrás, zzz456 disse:

conversor "atoi" de 'char' para 'inteiro'.

 

os argumentos digitados vem naturalmente no formato string porque é o mais prático. Então quando você precisa de algum argumento em outro formato você converte usando as rotinas de conversão, como atoi() ou atof() que estão declaradas em stdlib.h

 

Onde está _mkdir()?

 

Está em direct.h no caso do Windows. No Unix/Linux acho que está em unistd.h mas não estou certo. 

 

Veja a descrição de _mkdir() em https://docs.microsoft.com/pt-br/cpp/c-runtime-library/reference/mkdir-wmkdir?view=vs-2019 oficial

 

2 horas atrás, zzz456 disse:

A impressão que dá é que para criar nossos programinhas de forma segura, temos que aprender todas as ferramentas da linguagem

 

:D Nem tanto. Apenas as ferramentas que tem a ver com o problema a ser resolvido. Mas chamar system() não é solução. É como você escreve escrever aqui pedindo para alguém fazer um programa, ou pagar alguém pra fazer.

 

É como quando você pergunta pra alguém um caminho para algum lugar e a pessoa faz aquela cara de intelectual e diz pra você abrir o GPS e digitar o endereço...

 

 

 

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...