Preciso entregar daqui a uma hora e meia. Não consigo imprimir assim abaixo a estrutura de pastas e arquivos: c:/ dir1 arquivo2.txt dir3 arquivo4.txt dir2 arquivo3.txt
Abaixo o código:
import java.io.IOException; import java.util.*;
// Classe ELEMENTO ----------------------------------------------------------------------------- abstract class Elemento{ private String nome;
public Elemento(String nome){
this.nome = nome;
}
public String getNome() {
return nome;
}
public abstract int getTamanho();
public String toString() {
return nome;
}
}
// Classe PASTA ----------------------------------------------------------------------------- class Pasta extends Elemento { private List elementos = new ArrayList<>(); int cont = 1;
public Pasta (String nome) {
super(nome);
}
public void adiciona (Elemento o) {
if (o instanceof Pasta){
((Pasta) o).cont++;
}
elementos.add(o);
}
public void excluiArquivos(String palavra) {
for (Elemento elemento : elementos) {
if (elemento instanceof Pasta) {
((Pasta) elemento).remover(palavra);
}
else {
if (palavra.equals(elemento.getNome())) {
elementos.remove(elemento);
break;
}
}
}
}
public void excluirPasta(String palavra) {
for (Elemento elemento : elementos) {
if (palavra.equals(elemento.getNome())) {
elementos.remove(elemento);
break;
} else if (elemento instanceof Pasta) {
((Pasta) elemento).remover(palavra);
} else {
System.out.println("Pasta não existe!");
}
}
}
/*
Remover funcionando perfeitinho!
*/
public void remover(String linha) {
String vect[], vect2[];
vect = linha.split("/");
String palavra = vect[vect.length - 1];
vect2 = palavra.split("\\.");
if (vect2.length == 2) {
excluiArquivos(palavra);
}
else {
excluirPasta(palavra);
}
}
@Override
public String getNome(){
return super.getNome();
}
@Override
public int getTamanho() {
int tamanho = 0;
for (Elemento elemento : elementos) {
tamanho += elemento.getTamanho();
}
return tamanho;
}
/*
A questão da letra "e" a posição das pastas está funcionando, só está faltando o posicionamento dos arquivos.
Tentei muito mesmo mas não consegui uma solução. Tentei de todas as formas! Tentei um contador global,
tentei resignificar a classe Arquivo.
Enfim, vou gostar muito depois de saber como funciona.
*/
public String toString() {
String acumula = "";
for (Elemento elemento : elementos) {
if (elemento instanceof Pasta) {
for (int i = 0; i < cont; i++) {
acumula += "\t";
}
acumula += elemento.toString() + "\n";
} else {
for (int i = 0; i < cont; i++) {
acumula += "\t";
}
acumula += elemento.getNome() + "\n";
}
}
return this.getNome() + "\n" + acumula;
}
}
// Classe ARQUIVO ----------------------------------------------------------------------------- class Arquivo extends Elemento{ int tamanho;
public Arquivo (String nome, int tam) {
super(nome);
this.tamanho = tam;
}
@Override
public String getNome(){
return super.getNome();
}
@Override
public int getTamanho() {
return tamanho;
}
}
// Classe AD2 ----------------------------------------------------------------------------- public class AD2_ { public static void main(String[] args) {
Pasta p1 = new Pasta("dir1");
p1.adiciona(new Arquivo("arquivo1.txt", 150));
p1.adiciona(new Arquivo("arquivo2.txt", 200));
Pasta p2 = new Pasta("dir2");
p2.adiciona(new Arquivo("arquivo3.txt", 500));
Pasta p3 = new Pasta("dir3");
p3.adiciona(new Arquivo("arquivo4.txt", 350));
p3.adiciona(p2);
Pasta raiz = new Pasta("c:/");
raiz.adiciona(p1);
raiz.adiciona(p3);
raiz.remover("dir2/arquivo3.txt");
System.out.println(raiz.getTamanho());
System.out.println(raiz);
}
}