Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
397098a
fea: implement file and directory management with error handling
alvimdev Apr 13, 2025
b8d7c9d
fea: enhance file system implementation with user management and perm…
alvimdev Apr 16, 2025
cbd6350
fea: implement user management with addUser and removeUser methods in…
alvimdev Apr 16, 2025
f86942b
fea: enhance file reading functionality with offset management and im…
alvimdev May 2, 2025
71c8bc1
fea: enhance user management by adding exception handling for addUser…
alvimdev May 3, 2025
cb6e24a
fea: refactor user removal method to accept username and enhance Arqu…
alvimdev May 3, 2025
4a38181
fea: add comprehensive unit tests for FileSystem class methods includ…
alvimdev May 3, 2025
bc10d4a
fea: update FileSystem and IFileSystem classes to improve user manage…
alvimdev May 3, 2025
6515946
fea: enhance PermissionTest class with comprehensive permission tests…
alvimdev May 3, 2025
51c4c3a
fea: add OperacaoInvalidaException and update methods across the file…
alvimdev May 4, 2025
4da642a
fea: update mkdir method to streamline directory creation and enhance…
alvimdev May 6, 2025
b77969e
modularização
marcosffp Jun 16, 2025
9ef4773
formatação
marcosffp Jun 16, 2025
b9ea6b6
atualização
marcosffp Jun 17, 2025
efbbd0d
ref: remove redundant permission checks and enhance directory navigat…
marcosffp Jun 17, 2025
3973d09
correção
marcosffp Jun 17, 2025
cdb72c1
Merge pull request #1 from alvim-puc/marcos
marcosffp Jun 17, 2025
682f5ef
correçoes dnv
marcosffp Jun 17, 2025
04aeee2
correções
marcosffp Jun 17, 2025
a4ceba9
anexo da nova verificação
marcosffp Jun 17, 2025
af008a3
modularização
marcosffp Jun 17, 2025
e51fdb8
Merge pull request #2 from alvim-puc/marcos
alvimdev Jun 18, 2025
be5a6eb
enh: add new users and update pedro's permissions
alvimdev Jun 19, 2025
485386c
correção nos testes
luisajardim Jun 19, 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
90 changes: 52 additions & 38 deletions Main.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
import filesys.IFileSystem;
import filesys.Offset;
import filesys.Usuario;

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

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

import exception.OperacaoInvalidaException;
import filesys.FileSystem;

// MENU INTERATIVO PARA O SISTEMA DE ARQUIVOS
Expand All @@ -17,7 +19,6 @@ public class Main {
// 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 = "/";
private static final int READ_BUFFER_SIZE = 256;

// Sistema de arquivos
Expand All @@ -27,7 +28,7 @@ public class Main {
private static Scanner scanner = new Scanner(System.in);

// Usuário que está executando o programa
private static String user;
private static String username;

// 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.
Expand All @@ -39,7 +40,11 @@ public static void main(String[] args) {
System.out.println("Usuário não fornecido");
return;
}
user = args[1];
username = args[1];

// Cria o sistema de arquivos
// O sistema de arquivos é inteiramente virtual, ou seja, será reiniciado a cada execução do programa.
fileSystem = new FileSystem();

// Carrega a lista de usuários do sistema a partir de arquivo
// Formato do arquivo users:
Expand All @@ -59,15 +64,25 @@ public static void main(String[] args) {
String[] parts = line.split(" ");
if (parts.length == 3) {
String userListed = parts[0];
String dir = parts[1];
String dir = parts[1].substring(0, 1); // O primeiro caractere é o diretório
String dirPermission = parts[2];

/* A FAZER:
/*
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
*/

if (userListed.equals(ROOT_USER)) {
System.out.println("O usuário root já está adicionado.");
continue;
}

Usuario user = new Usuario(userListed, dirPermission, dir);

fileSystem.addUser(user);

} else {
System.out.println("Formato ruim no arquivo de usuários. Linha: " + line);
Expand All @@ -77,22 +92,8 @@ public static void main(String[] args) {
userScanner.close();
} catch (FileNotFoundException e) { // Retorna se o arquivo de usuários não for encontrado
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());
// }

// Menu interativo.
menu();
Expand Down Expand Up @@ -153,7 +154,7 @@ public static void menu() {
default:
System.out.println("Comando inválido!");
}
} catch (CaminhoNaoEncontradoException | CaminhoJaExistenteException | PermissaoException e) {
} catch (CaminhoNaoEncontradoException | CaminhoJaExistenteException | PermissaoException | OperacaoInvalidaException e) {
System.out.println("Erro: " + e.getMessage());
}

Expand All @@ -172,14 +173,14 @@ public static void chmod() throws CaminhoNaoEncontradoException, PermissaoExcept
System.out.println("Insira a permissão (formato: 3 caracteres\"rwx\"):");
String permissoes = scanner.nextLine();

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

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

fileSystem.mkdir(caminho, user);
fileSystem.mkdir(caminho, username);
}

public static void rm() throws CaminhoNaoEncontradoException, PermissaoException {
Expand All @@ -188,17 +189,17 @@ public static void rm() throws CaminhoNaoEncontradoException, PermissaoException
System.out.println("Remover recursivamente? (true/false):");
boolean recursivo = Boolean.parseBoolean(scanner.nextLine());

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

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

fileSystem.touch(caminho, user);
fileSystem.touch(caminho, username);
}

public static void write() throws CaminhoNaoEncontradoException, PermissaoException {
public static void write() throws CaminhoNaoEncontradoException, PermissaoException, OperacaoInvalidaException {
System.out.println("Insira o caminho do arquivo a ser escrito:");
String caminho = scanner.nextLine();
System.out.println("Anexar? (true/false):");
Expand All @@ -207,24 +208,37 @@ public static void write() throws CaminhoNaoEncontradoException, PermissaoExcept
String content = scanner.nextLine();
byte[] buffer = content.getBytes();

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

public static void read() throws CaminhoNaoEncontradoException, PermissaoException {
public static void read() throws CaminhoNaoEncontradoException, PermissaoException, OperacaoInvalidaException {
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, username, 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);
fileSystem.mv(caminhoAntigo, caminhoNovo, username);
}

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

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

public static void cp() throws CaminhoNaoEncontradoException, PermissaoException {
Expand All @@ -244,6 +258,6 @@ public static void cp() throws CaminhoNaoEncontradoException, PermissaoException
System.out.println("Copiar recursivamente? (true/false):");
boolean recursivo = Boolean.parseBoolean(scanner.nextLine());

fileSystem.cp(caminhoOrigem, caminhoDestino, user, recursivo);
fileSystem.cp(caminhoOrigem, caminhoDestino, username, 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);
}
}
87 changes: 87 additions & 0 deletions filesys/Arquivo.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
package filesys;

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

public class Arquivo extends Diretorio {
private static final int TAMANHO_BLOCO = 4096; // 4KB por bloco (ajuste conforme necessário)
private List<Bloco> blocos;
private long tamanho;

public Arquivo(String nome, String permissoes, String dono) {
super(nome, permissoes, dono);
this.blocos = new ArrayList<>();
this.tamanho = 0;
this.filhos = null; // Arquivos não podem ter filhos
}

// Classe interna para representar blocos
public static class Bloco {
byte[] dados;

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

public Bloco(byte[] dados2) {
this.dados = new byte[dados2.length];
System.arraycopy(dados2, 0, this.dados, 0, Math.min(dados2.length, TAMANHO_BLOCO));
}

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

}

public void addBloco(Bloco bloco) {
this.blocos.add(bloco);
}

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

public int getTamMaxBloco() {
return TAMANHO_BLOCO;
}

public List<Bloco> getBlocos() {
return blocos;
}



public void setBlocos(List<Bloco> blocos) {
this.blocos = blocos;
}

public void incrementTamnho(long tamanho) {
this.tamanho += tamanho;
}

public long getTamanho() {
return tamanho;
}

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

@Override
public void adicionarFilho(Diretorio filho) {
throw new UnsupportedOperationException("Arquivos não podem conter filhos.");
}

@Override
public void removerFilho(String nome) {
throw new UnsupportedOperationException("Arquivos não podem conter filhos.");
}

@Override
public String toString() {
return "A " + permissoes + " " + dono + " " + nome + " " + tamanho + " bytes";
}
}
Loading