Operações com arquivos [RESOLVIDO]

1. Operações com arquivos [RESOLVIDO]

doom load
doomload

(usa Ubuntu)

Enviado em 18/10/2016 - 11:27h

Olá pessoal,

Como parte de um programa que eu estou fazendo eu estou querendo trabalhar com comandos do bash em linguagem c, para isso me utilizo da função system, então utilizo comandos como mv, rm, mkdir entre outros para manipulação dos arquivos, porém não esta legal, tenho notado erros que eu ainda não compreendo o motivo mas me parece que a alternativa que eu escolhi não é das melhores.

Notei problemas como sumiço de arquivos, mudança de extensão e arquivos diferentes dos existentes aparecendo onde não deviam, enfim, algo muito errado acontece e eu não compreendo o porque.

Em alguns testes eu tentei navegar por uma estrutura de pastas e listar os arquivos por exemplo e eu vi que isso não é possível, então parece que o problema sou eu quem não sabe trabalhar da forma correta. O resultado do teste acima foi que os arquivos listados foram sempre da raiz do meu programa.

Para que vocês entendam melhor:


system("ls");
system("cd a");
system("ls");
system("cd ..");
system("ls");


Como vocês profissionais trabalham lidam com isso? Como trabalhar de maneira segura com comandos do bash em C?

Obrigado.


  


2. MELHOR RESPOSTA

Uilian Ries
uilianries

(usa Linux Mint)

Enviado em 18/10/2016 - 11:48h

Opção 1:
Utilizar system calls e solicitar ao sistema operacional fazer a tarefa.

No Linux:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <dirent.h>

int main(void) {
DIR* d;
struct dirent *dir;

if (chdir("/tmp/") == -1) {
perror("Não pode mudar para /tmp");
exit(EXIT_FAILURE);
}

d = opendir(".");
if (d) {
while ((dir = readdir(d)) != NULL) {
printf("Nome do diretório: %s\n", dir->d_name);
}
closedir(d);
}
return EXIT_SUCCESS;
}


Aqui utilizei POSIX para exemplificar.
Se for necessário fazer isso no Windows, irá precisar usar Windows API. O problema é a portabilidade, neste caso.

Opção 2:
Utilizar bibliotecas para portar o código.
Em C++17 ou boost, existe tratamento ao sistema de arquivos.

#include <boost/filesystem.hpp>
#include <boost/range/iterator_range.hpp>
#include <iostream>

using namespace boost::filesystem;

int main() {
path p("/tmp");
for(auto& entry : boost::make_iterator_range(directory_iterator(p), {})) {
std::cout << entry << "\n";
}
return EXIT_SUCCESS;
}


Isso resulta em ganho de portabilidade, em contrapartida, irá haver uma dependência a mais ao projeto.

--
Uilian Ries
Linux Counter: 521986

3. Re: Operações com arquivos [RESOLVIDO]

doom load
doomload

(usa Ubuntu)

Enviado em 24/10/2016 - 21:39h

obrigado pela dica






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts