Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
151b1ea
Feat: implement user management in the file system and mkdir
piterofc May 28, 2025
6074247
Feat: refatorar sistema de arquivos e adicionar classe de bloco de dados
piterofc Jun 1, 2025
5550303
Implementando mkdir
piterofc Jun 9, 2025
57d1f1a
Fix: script rápido para iniciar programa
piterofc Jun 9, 2025
65bb025
Merge branch 'dev' of https://github.com/LeonardodeSouzaGalvao/filesy…
piterofc Jun 9, 2025
406b78a
Fix: mandando arquivos de compilação pra pasta bin
piterofc Jun 9, 2025
e53925f
Merge branch 'dev' of https://github.com/LeonardodeSouzaGalvao/filesy…
piterofc Jun 9, 2025
1576f7c
Feat: finalizando implementação do mkdir
piterofc Jun 10, 2025
af838dd
Feat: melhorando visual de pastas e arquivos
piterofc Jun 10, 2025
3de05ec
Feat: implementando listagem
piterofc Jun 10, 2025
3057eb3
Merge pull request #1 from LeonardodeSouzaGalvao/mkdir
piterofc Jun 10, 2025
a7eeaa1
Merge pull request #2 from LeonardodeSouzaGalvao/ls
piterofc Jun 10, 2025
ddfd827
feature: Starting implementation of touch
LeonardodeSouzaGalvao Jun 10, 2025
d50aae7
Fix: formatando e add exceção para funcionamento
piterofc Jun 10, 2025
d52387d
Feat: melhorando visual de arquivos
piterofc Jun 10, 2025
37b78a4
Merge branch 'ls' of https://github.com/LeonardodeSouzaGalvao/filesys…
piterofc Jun 10, 2025
ab99c26
Merge branch 'dev' of https://github.com/LeonardodeSouzaGalvao/filesy…
piterofc Jun 10, 2025
d6a43bb
Merge pull request #3 from LeonardodeSouzaGalvao/touch
LeonardodeSouzaGalvao Jun 10, 2025
b95e69c
Feat: chmod
piterofc Jun 10, 2025
ce160c7
Merge pull request #4 from LeonardodeSouzaGalvao/chmod
piterofc Jun 10, 2025
e3d185d
feature: Remove
LeonardodeSouzaGalvao Jun 11, 2025
0ef274e
Merge pull request #5 from LeonardodeSouzaGalvao/rm
LeonardodeSouzaGalvao Jun 12, 2025
0d093fa
feat: remove commented-out section
LeonardodeSouzaGalvao Jun 12, 2025
a064d88
feat: implement mv method (NOT FINISHED)
LeonardodeSouzaGalvao Jun 13, 2025
aebf080
TODO: Renomeação
LeonardodeSouzaGalvao Jun 13, 2025
3bbf135
feat: implement cp method for copying files and directories
LeonardodeSouzaGalvao Jun 13, 2025
625f5b1
Update: renomeação implementada
LeonardodeSouzaGalvao Jun 13, 2025
93918b4
Merge pull request #6 from LeonardodeSouzaGalvao/cp
LeonardodeSouzaGalvao Jun 14, 2025
c675d17
Merge pull request #7 from LeonardodeSouzaGalvao/mv
LeonardodeSouzaGalvao Jun 14, 2025
47286cf
Formatando arquivo
piterofc Jun 14, 2025
906c9d6
Feat: implementação do write
piterofc Jun 14, 2025
d8c0a73
Feat: implementação do read
piterofc Jun 14, 2025
fdc3efb
Merge pull request #8 from LeonardodeSouzaGalvao/read/write
piterofc Jun 14, 2025
7bc2855
Feat: implementando addUser
piterofc Jun 15, 2025
74baa49
Merge pull request #9 from LeonardodeSouzaGalvao/addUser
piterofc Jun 15, 2025
4e8fe8c
Feat: implementando testes mkdir, touch e chmod
piterofc Jun 15, 2025
4fd166e
Correção de permissões e mais testes
LeonardodeSouzaGalvao Jun 16, 2025
43ce51f
Feature/ Comando Cp agora sobrescreve outros arquivos
LeonardodeSouzaGalvao Jun 17, 2025
9f4ca12
Fixing some tests
LeonardodeSouzaGalvao Jun 17, 2025
80defbd
Fix: Some tests
LeonardodeSouzaGalvao Jun 19, 2025
9c96c32
Fix: tests
LeonardodeSouzaGalvao Jun 19, 2025
a69ff8f
Fix: corrigindo testes e implementação do mv
piterofc Jun 19, 2025
18e16da
Formatando FileSystemImpl
piterofc Jun 19, 2025
1150af1
Finalizando testes
piterofc Jun 19, 2025
9896709
Merge pull request #10 from LeonardodeSouzaGalvao/testes
piterofc Jun 19, 2025
617cd88
Fix: Error messeges fixed
LeonardodeSouzaGalvao Jun 19, 2025
02b0c85
Merge pull request #11 from LeonardodeSouzaGalvao/dev
LeonardodeSouzaGalvao Jun 19, 2025
a24be5a
Fix: requerindo permissão geral e específica para as ações
piterofc Jun 21, 2025
2d36d92
Merge pull request #12 from LeonardodeSouzaGalvao/dev
piterofc Jun 21, 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
70 changes: 55 additions & 15 deletions Main.java
Original file line number Diff line number Diff line change
@@ -1,13 +1,18 @@
import filesys.IFileSystem;
import filesys.Usuario;

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

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


import filesys.FileSystem;
import filesys.Dir;

// MENU INTERATIVO PARA O SISTEMA DE ARQUIVOS
// SINTA-SE LIVRE PARA ALTERAR A CLASSE MAIN
Expand All @@ -29,6 +34,9 @@ public class Main {
// Usuário que está executando o programa
private static String user;

// Lista de usuários
private static List<Usuario> usuarios = new ArrayList<>();

// 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) {
Expand Down Expand Up @@ -68,7 +76,8 @@ public static void main(String[] args) {
*/
System.out.println(userListed + " " + dir + " " + dirPermission); // Somente imprime o usuário, diretório e permissão


// Adicionar usuário à lista
usuarios.add(new Usuario(userListed, dir, dirPermission));
} else {
System.out.println("Formato ruim no arquivo de usuários. Linha: " + line);
}
Expand All @@ -80,19 +89,28 @@ public static void main(String[] args) {

return;
}


/* REMOVER ISSO PQ NÃO PRECISA
System.out.println("Usuários carregados:");
for (Usuario user : usuarios) {
System.out.println(user);
}
*/

// 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?*/);
fileSystem = new FileSystem(usuarios);

// // 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());
// }
// 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 +171,7 @@ public static void menu() {
default:
System.out.println("Comando inválido!");
}
} catch (CaminhoNaoEncontradoException | CaminhoJaExistenteException | PermissaoException e) {
} catch (CaminhoNaoEncontradoException | CaminhoJaExistenteException | PermissaoException | IllegalArgumentException e) {
System.out.println("Erro: " + e.getMessage());
}

Expand Down Expand Up @@ -185,13 +203,15 @@ public static void mkdir() throws CaminhoJaExistenteException, PermissaoExceptio
public static void rm() throws CaminhoNaoEncontradoException, PermissaoException {
System.out.println("Insira o caminho do diretório a ser removido:");
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 {

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

Expand All @@ -210,12 +230,32 @@ public static void write() throws CaminhoNaoEncontradoException, PermissaoExcept
fileSystem.write(caminho, user, anexar, buffer);
}

// Read foi modificado
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.

int offset = 0; // Offset para leitura
int offsetAntes;
int leitura;

System.out.println("Lendo arquivo: " + caminho + "\n");

do {
offsetAntes = offset; // Salva o offset antes da leitura
offset += fileSystem.read(caminho, user, buffer, offset); // Lê o arquivo no caminho especificado
leitura = offset - offsetAntes; // Calcula a quantidade de bytes lidos nesta iteração

if (leitura > 0) {
System.out.write(buffer, 0, leitura); // Escreve os bytes lidos no console
} else {
break; // Se não houver mais bytes para ler, sai do loop
}
} while (leitura > 0); // Garante que o offset seja não negativo

System.out.flush(); // Garante que todos os bytes sejam escritos no console
System.out.println("\n\nLeitura concluída.");
}

public static void mv() throws CaminhoNaoEncontradoException, PermissaoException {
Expand All @@ -228,9 +268,9 @@ public static void mv() throws CaminhoNaoEncontradoException, PermissaoException
}

public static void ls() throws CaminhoNaoEncontradoException, PermissaoException {
System.out.println("Insira o caminho do diretório a ser listado:");
System.out.print("Insira o caminho do diretório a ser listado: ");
String caminho = scanner.nextLine();
System.out.println("Listar recursivamente? (true/false):");
System.out.print("Listar recursivamente? (true/false): ");
boolean recursivo = Boolean.parseBoolean(scanner.nextLine());

fileSystem.ls(caminho, user, recursivo);
Expand Down
29 changes: 29 additions & 0 deletions filesys/BlocoDeDados.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package filesys;

public class BlocoDeDados {
private byte[] dados; // Dados do bloco

// Construtores
public BlocoDeDados() {
this.dados = new byte[File.TAMANHO_BYTES_BLOCO]; // Inicializa o bloco com o tamanho especificado
}

public BlocoDeDados(byte[] dados) {
setDados(dados);
}


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

public void setDados(byte[] dados) {
if (dados.length <= File.TAMANHO_BYTES_BLOCO) {
this.dados = new byte[dados.length];
System.arraycopy(dados, 0, this.dados, 0, dados.length); // Copia os novos dados para o bloco
} else {
throw new IllegalArgumentException("Dados excedem o tamanho do bloco.");
}
}
}
214 changes: 214 additions & 0 deletions filesys/Dir.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,214 @@
package filesys;

import java.util.HashMap;
import java.util.Map;

public class Dir {
// Atributos
private String nome;
private String dono;
private String permissoes;

// Relacionamentos
protected Dir pai;
protected Map<String, Dir> filhos;
private Map<String, String> permissoesUsuarios;

// Construtor
public Dir(String nome, String dono, String permissoes) {
this.nome = nome;
this.dono = dono;
this.permissoes = permissoes;

this.pai = null; // Inicialmente, o diretório não tem pai
this.filhos = new HashMap<>();
this.permissoesUsuarios = new HashMap<>();

// Define as permissões iniciais para o dono do diretório
this.permissoesUsuarios.put(dono, "rwx"); // O dono tem permissão total
}

// Nome
public String getNome() {
return nome;
}

public void setNome(String nome) {
this.nome = nome;
}


// Dono
public String getDono() {
return dono;
}

public void setDono(String dono) {
this.dono = dono;
}


// Permissões
public String getPermissoes() {
return permissoes;
}

public void setPermissoes(String permissoes) {
this.permissoes = permissoes;
}


// Pai
public Dir getPai() {
return pai;
}

public void setPai(Dir pai) {
this.pai = pai;
}


// Filhos
public Map<String, Dir> getFilhos() {
return filhos;
}

public Dir getFilho(String nome) {
return filhos.get(nome);
}

public void setFilhos(Map<String, Dir> filhos) {
this.filhos = filhos;
for (Dir filho : filhos.values()) {
filho.setPai(this); // Define o pai de cada filho
}
}

public void addFilho(Dir filho) {
filhos.put(filho.getNome(), filho);
filho.setPai(this); // Define o pai do filho
}

public void removeFilho(String nome) {
filhos.remove(nome);
}


// Permissões dos usuários
public Map<String, String> getPermissoesUsuarios() {
return permissoesUsuarios;
}

public String getPermissoesUsuario(String usuario) {
if ("root".equals(usuario)) return "rwx"; // O usuário root sempre tem permissão total

// Verifica se o usuário é nulo ou vazio
if (usuario == null || usuario.isEmpty()) {
throw new IllegalArgumentException("Usuário não pode ser nulo ou vazio");
}

// Verifica se o usuário tem permissões definidas
if (!permissoesUsuarios.containsKey(usuario)) {
throw new IllegalArgumentException("Usuário não encontrado: " + usuario);
}

if (dono.equals(usuario)) return permissoes; // O dono do diretório tem as permissões do diretório

return permissoesUsuarios.getOrDefault(usuario, "---"); // Retorna as permissões do usuário ou um padrão se não tiver
}

public void setPermissoesUsuario(String usuario, String permissoes) {
if (permissoes == null || permissoes.length() != 3) {
throw new IllegalArgumentException("As permissões precisam ter 3 caracteres");
}

this.permissoesUsuarios.put(usuario, permissoes);
}


// Verifica se o usuário tem permissão para acessar o diretório
public boolean temPerm(String usuario, String permissao) {
// Verifica se o usuário é nulo ou vazio
if (usuario == null || usuario.isEmpty()) {
throw new IllegalArgumentException("Usuário não pode ser nulo ou vazio");
}

if ("root".equals(usuario)) {
return true; // O dono do diretório sempre tem permissão total
}

if (usuario.equals(dono)) {
return true; // O dono do diretório sempre tem permissão total
}

// Verifica se a permissão é nula ou vazia
if (permissao == null || permissao.isEmpty()) {
throw new IllegalArgumentException("Permissão não pode ser nula ou vazia");
}

// Verifica se o usuário tem permissões definidas
if (!permissoesUsuarios.containsKey(usuario)) {
throw new IllegalArgumentException("Usuário não encontrado nas permissões: " + usuario);
}

String permissoesUsuario = getPermissoesUsuario(usuario);

// Verifica se o usuário tem a permissão solicitada
if (permissoesUsuario.contains(permissao)) {
return true; // O usuário tem a permissão solicitada
}

// Se não tiver a permissão solicitada, verifica permissões do diretório pai
if (pai != null) {
return pai.temPerm(usuario, permissao); // Verifica no diretório pai
}

// Se não, o usuário não tem permissão
return false;
}


// É um arquivo?
public boolean isArquivo() {
return false; // Esta classe representa um diretório, não um arquivo
}

public String getCaminhoCompleto(){
if(this.getPai() == null){
return "/" + this.getNome();
}
else{
String caminhoPai = this.getPai().getCaminhoCompleto();
if(caminhoPai.endsWith("/")){
return caminhoPai + this.getNome();
} else {
return caminhoPai + "/" + this.getNome();
}
}
}


public boolean temSubdiretorios() {
for (Dir filho : getFilhos().values()) {
if (!filho.isArquivo()) {
return true;
}
}
return false;
}


// Transformando em string
@Override
public String toString() {
StringBuilder sb = new StringBuilder();

sb.append(" Diretório: ").append(nome).append("\n")
.append(" - Dono: ").append(dono).append("\n")
.append(" - Permissões: ").append(permissoes).append("\n")
.append(" - Pai: ").append(pai != null ? pai.getNome() : "Nenhum").append("\n")
.append(" - Filhos: ").append(getFilhos().isEmpty() ? "Nenhum" : getFilhos().keySet()).append("\n")
.append(" - Permissões dos usuários: ").append(permissoesUsuarios).append("\n");
return sb.toString();
}
}
Loading