Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
0ff9f0a
teste
ArlindoSPJr Jun 2, 2025
ff23747
teste 2
JoaquimGCVS Jun 2, 2025
1c86c86
Estrutura do projeto
Jun 2, 2025
bae4a98
implementado cp
ArlindoSPJr Jun 2, 2025
ec1002c
update : Trocar o uso de
Jun 3, 2025
743cd2f
add construtores com String
Jun 3, 2025
a9f9ef8
feat : MKDIR
Jun 3, 2025
42c9019
feat: modificando metodo cp
ArlindoSPJr Jun 3, 2025
e54975f
feat : TOUCH
Jun 3, 2025
6166bcb
Metodo ls implementado
JoaquimGCVS Jun 3, 2025
e790f8a
feat : CHMOD
Jun 3, 2025
5a9a239
refactor: improve code readability and structure in Main.java
Jun 3, 2025
361dfd8
test: add JUnit tests for chmod, mkdir, and touch methods in FileSyst…
Jun 3, 2025
ede67e2
feat: implement ls method to list directory contents with optional re…
JoaquimGCVS Jun 3, 2025
4c118b6
feat: crianco método mv, getParentePath e getNameFromPath
ArlindoSPJr Jun 3, 2025
9e8517a
feat: criando a função de read
ArlindoSPJr Jun 3, 2025
a09e165
feat: alterando pastas e refazendo metodo read
ArlindoSPJr Jun 3, 2025
2c82161
feat: refazendo metodo cp
ArlindoSPJr Jun 3, 2025
7a32f86
feat: refazendo metodo mv
ArlindoSPJr Jun 3, 2025
f4c87c0
feat: refazendo metodo ls
ArlindoSPJr Jun 3, 2025
33fcc64
feat: refazendo metodo touch
ArlindoSPJr Jun 3, 2025
38ffaee
feat: refazendo chmod
ArlindoSPJr Jun 3, 2025
5604551
feat: implementando mkdir, faltando apenas mkdir -p
ArlindoSPJr Jun 3, 2025
158720b
testando: touch, write e read
ArlindoSPJr Jun 3, 2025
54c4991
feat: implement mkdir with recursive directory creation - flag -p
Jun 3, 2025
56138f6
feat: implement rm method with recursive directory removal and permis…
Jun 3, 2025
96d753b
refactor: remove unsupported addUser method from FileSystemImpl
Jun 3, 2025
1031f22
test: add comprehensive tests for FileSystemImpl methods
Jun 3, 2025
7cded69
test: add tests for mv and cp commands, including directory handling
JoaquimGCVS Jun 4, 2025
1bb0f4d
test: corrigindo erro nos testes de permissao com o usuario root
JoaquimGCVS Jun 19, 2025
647c118
feat: faltando corrigir permissões para outros usuario, testes funcio…
ArlindoSPJr Jun 20, 2025
a4f2e59
implementando para novo arquivo
ArlindoSPJr Jun 27, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
130 changes: 68 additions & 62 deletions Main.java
Original file line number Diff line number Diff line change
@@ -1,20 +1,25 @@
import filesys.IFileSystem;
import filesys.Offset;
import filesys.Usuario;
import filesys.FileSystem;

import java.util.Scanner;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;

import exception.PermissaoException;
import exception.CaminhoJaExistenteException;
import exception.CaminhoNaoEncontradoException;

import filesys.FileSystem;

// MENU INTERATIVO PARA O SISTEMA DE ARQUIVOS
// SINTA-SE LIVRE PARA ALTERAR A CLASSE MAIN
/*
MENU INTERATIVO PARA O SISTEMA DE ARQUIVOS
SINTA-SE LIVRE PARA ALTERAR A CLASSE MAIN
*/
public class Main {

// Constantes úteis para a versão interativa.
// Para esse tipo de execução, o tamanho max do buffer de
// Constantes úteis para a versão interativa.
// Para esse tipo de execução, o tamanho max do buffer de
// leitura pode ser menor.
private static final String ROOT_USER = "root";
private static final String ROOT_DIR = "/";
Expand All @@ -29,30 +34,21 @@ public class Main {
// Usuário que está executando o programa
private static String user;

// O sistema de arquivos é inteiramente virtual, ou seja, será reiniciado a cada execução do programa.
// Logo, não é necessário salvar os arquivos em disco. O sistema será uma simulação em memória.
// O sistema de arquivos é inteiramente virtual, ou seja, será reiniciado a cada
// execução do programa.
// Logo, não é necessário salvar os arquivos em disco. O sistema será uma
// simulação em memória.
public static void main(String[] args) {
// Usuário que está executando o programa.
// Para quaisquer operações que serão feitas por esse usuário em um caminho /path/**,
// deve-se checar se o usuário tem permissão de escrita (r) neste caminho.
if (args.length < 2) {
System.out.println("Usuário não fornecido");
return;
}
user = args[1];

// Carrega a lista de usuários do sistema a partir de arquivo
// Formato do arquivo users:
// username dir permission
// Exemplo:
// maria /** rw-
// luzia /** rwx
// Essa permissão vale para o diretório raiz e sub diretórios.
// A partir do momento que um usuário cria outro diretório ou arquivo,
// a permissão desse usuário é de leitura, escrita e execução nesse novo diretório/arquivo,
// e sempre será rwx para o usuário root.
List<Usuario> usuarios = new ArrayList<>();
try {
Scanner userScanner = new Scanner(new java.io.File("users/users"));
Scanner userScanner = new Scanner(new java.io.File("users/userMkdir"));
while (userScanner.hasNextLine()) {
String line = userScanner.nextLine().trim();
if (!line.isEmpty()) {
Expand All @@ -61,46 +57,44 @@ public static void main(String[] args) {
String userListed = parts[0];
String dir = parts[1];
String dirPermission = parts[2];

/* A FAZER:
* Processar a permissão de todos os usuários existentes por diretório.
* Por enquanto esse código somente imprime as permissões contidas no arquivo users.
*/
System.out.println(userListed + " " + dir + " " + dirPermission); // Somente imprime o usuário, diretório e permissão


usuarios.add(new Usuario(userListed, dirPermission, dir));
} else {
System.out.println("Formato ruim no arquivo de usuários. Linha: " + line);
}
}
}
userScanner.close();
} catch (FileNotFoundException e) { // Retorna se o arquivo de usuários não for encontrado
} catch (FileNotFoundException e) {
System.out.println("Arquivo de usuários não encontrado");

return;
}

// Finalmente cria o Sistema de Arquivos
// Lista de usuários é imutável durante a execução do programa
// Obs: Como passar a lista de usuários para o FileSystem?
fileSystem = new FileSystem(/*usuários?*/);

// // DESCOMENTE O BLOCO ABAIXO PARA CRIAR O DIRETÓRIO RAIZ ANTES DE RODAR O MENU
// // Cria o diretório raiz do sistema. Root sempre tem permissão total "rwx"
// try {
// fileSystem.mkdir(ROOT_DIR, ROOT_USER);
// } catch (CaminhoJaExistenteException | PermissaoException e) {
// System.out.println(e.getMessage());
// }

// Inicializa o sistema de arquivos com a lista de usuários
fileSystem = new FileSystem(usuarios);

// Cria os diretórios e aplica as permissões conforme o arquivo
for (Usuario usuario : usuarios) {
try {
fileSystem.mkdir(usuario.getDiretorio(), usuario.getNome());
// Aplica a permissão do arquivo para o usuário no diretório criado
fileSystem.chmod(usuario.getDiretorio(), "root", usuario.getNome(), usuario.getPermissao());
} catch (CaminhoJaExistenteException | PermissaoException | CaminhoNaoEncontradoException e) {
// Se já existe, não tem permissão ou não encontra, apenas ignore
}
}

// Cria o diretório raiz do sistema (caso não exista)
try {
fileSystem.mkdir(ROOT_DIR, ROOT_USER);
} catch (CaminhoJaExistenteException | PermissaoException e) {
// Pode ignorar se já existe
}

// Menu interativo.
menu();
}

// Menu interativo para fins de teste.
// Os testes junit não são feitos com esse menu,
// mas diretamente na interface IFileSystem
// … o resto de Main fica inalterado, igual ao que você já tinha …
public static void menu() {
while (true) {
System.out.println("\nComandos disponíveis:");
Expand Down Expand Up @@ -148,11 +142,10 @@ public static void menu() {
break;
case "0":
System.out.println("Encerrando...");

return;
default:
System.out.println("Comando inválido!");
}
}
} catch (CaminhoNaoEncontradoException | CaminhoJaExistenteException | PermissaoException e) {
System.out.println("Erro: " + e.getMessage());
}
Expand All @@ -169,16 +162,16 @@ public static void chmod() throws CaminhoNaoEncontradoException, PermissaoExcept
String caminho = scanner.nextLine();
System.out.println("Insira o usuário para o qual deseja alterar as permissões:");
String usuarioAlvo = scanner.nextLine();
System.out.println("Insira a permissão (formato: 3 caracteres\"rwx\"):");
System.out.println("Insira a permissão (formato: 3 caracteres\"rwx\"): ");
String permissoes = scanner.nextLine();

fileSystem.chmod(caminho, user, usuarioAlvo, permissoes);
}

public static void mkdir() throws CaminhoJaExistenteException, PermissaoException {
System.out.println("Insira o caminho do diretório a ser criado:");
String caminho = scanner.nextLine();

fileSystem.mkdir(caminho, user);
}

Expand All @@ -187,14 +180,14 @@ public static void rm() throws CaminhoNaoEncontradoException, PermissaoException
String caminho = scanner.nextLine();
System.out.println("Remover recursivamente? (true/false):");
boolean recursivo = Boolean.parseBoolean(scanner.nextLine());

fileSystem.rm(caminho, user, recursivo);
}

public static void touch() throws CaminhoJaExistenteException, PermissaoException {
System.out.println("Insira o caminho do arquivo a ser criado:");
String caminho = scanner.nextLine();

fileSystem.touch(caminho, user);
}

Expand All @@ -206,24 +199,37 @@ public static void write() throws CaminhoNaoEncontradoException, PermissaoExcept
System.out.println("Insira o conteúdo a ser escrito:");
String content = scanner.nextLine();
byte[] buffer = content.getBytes();

fileSystem.write(caminho, user, anexar, buffer);
}

public static void read() throws CaminhoNaoEncontradoException, PermissaoException {
System.out.println("Insira o caminho do arquivo a ser lido:");
String caminho = scanner.nextLine();
byte[] buffer = new byte[READ_BUFFER_SIZE]; // Exemplo de tamanho de buffer por load/leitura . O que acontece se o Buffer for menor que o conteúdo a ser lido?

fileSystem.read(caminho, user, buffer); // Lógica para ler arquivos maiores que o buffer deve ser implementada.
byte[] buffer = new byte[READ_BUFFER_SIZE];

Offset offset = new Offset(0);
int offsetAnterior;
int bytesLidos;

do {
offsetAnterior = offset.getValue();
fileSystem.read(caminho, user, buffer, offset);
bytesLidos = offset.getValue() - offsetAnterior;

if (bytesLidos > 0) System.out.write(buffer, 0, bytesLidos);
} while (bytesLidos > 0);

System.out.flush();
System.out.println();
}

public static void mv() throws CaminhoNaoEncontradoException, PermissaoException {
System.out.println("Insira o caminho do arquivo a ser movido:");
String caminhoAntigo = scanner.nextLine();
System.out.println("Insira o novo caminho do arquivo:");
String caminhoNovo = scanner.nextLine();

fileSystem.mv(caminhoAntigo, caminhoNovo, user);
}

Expand All @@ -232,7 +238,7 @@ public static void ls() throws CaminhoNaoEncontradoException, PermissaoException
String caminho = scanner.nextLine();
System.out.println("Listar recursivamente? (true/false):");
boolean recursivo = Boolean.parseBoolean(scanner.nextLine());

fileSystem.ls(caminho, user, recursivo);
}

Expand All @@ -243,7 +249,7 @@ public static void cp() throws CaminhoNaoEncontradoException, PermissaoException
String caminhoDestino = scanner.nextLine();
System.out.println("Copiar recursivamente? (true/false):");
boolean recursivo = Boolean.parseBoolean(scanner.nextLine());

fileSystem.cp(caminhoOrigem, caminhoDestino, user, recursivo);
}
}
7 changes: 7 additions & 0 deletions exception/OperacaoInvalidaException.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package exception;

public class OperacaoInvalidaException extends Exception {
public OperacaoInvalidaException(String message) {
super(message);
}
}
73 changes: 73 additions & 0 deletions filesys/Arquivo.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
package filesys;

import java.util.ArrayList;
import java.util.List;

public class Arquivo extends ElementoFS {
private List<byte[]> blocos;
private long tamanho;

public Arquivo(String nome, String permissoes, String dono) {
super(nome, permissoes, dono);
// this.arquivo = new Bloco[0];
this.blocos = new ArrayList<>();
this.tamanho = 0;
}

/*
* public Bloco[] getArquivo() {
* return arquivo;
* }
*
* public void setArquivo(Bloco[] arquivo) {
* this.arquivo = arquivo;
* }
*/

public void adicionarBloco(byte[] dados) {
blocos.add(dados);
tamanho += dados.length;
}

public List<byte[]> getBlocos() {
return blocos;
}

public long getTamanho() {
return tamanho;
}

public void removerBloco(int index) {
if (index < 0 || index >= blocos.size()) {
throw new IndexOutOfBoundsException("Índice fora dos limites da lista.");
}
byte[] removed = blocos.remove(index);
tamanho -= removed.length;
}

public void limparBlocos() {
blocos.clear();
tamanho = 0;
}

@Override
public boolean isArquivo() {
return true;
}

@Override
public String toString() {
return "Arquivo: " + nomeDiretorio + " | Dono: " + donoDiretorio + " | Permissões: " + permissoesPadrao + " | Tam: "
+ tamanho + " bytes";
}

public void adicionarFilho(ElementoFS filho) {
throw new UnsupportedOperationException("Não é possível adicionar filhos a um arquivo.");
}


public void removerFilho(String nomeFilho) {
throw new UnsupportedOperationException("Não é possível remover filhos de um arquivo.");
}

}
19 changes: 19 additions & 0 deletions filesys/Bloco.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package filesys;

public class Bloco {
private static final int TAMANHO_BLOCO = 4096; // 4KB por bloco
private byte[] dados;


public Bloco(int tamanho) {
this.dados = new byte[TAMANHO_BLOCO];
}

public byte[] getDados() {
return dados;
}

public void setDados(byte[] dados) {
this.dados = dados;
}
}
Loading