☕ Java - Fazer seu programa de prompt rodar a partir de qualquer diretório
Vou usar um programa que fiz para me auxiliar no trabalho como exemplo.
Explicando o meu programa
Tenho vários arquivos com esse formato de nome. Quero uma pasta para cada código conforme o nome dos arquivos, e que eles fiquem armazenados nelas.
VRJ_018_OPERADOR.sql
VRJ_018_AUXILIAR.sql
VRJ_018_CONTROLE.sql
VRJ_018_NEGOCIO.sql
PROCESS_042_OPERADOR.sql
PROCESS_042_AUXILIAR.sql
PROCESS_042_CONTROLE.sql
PROCESS_042_NEGOCIO.sql
ATIVO_030_OPERADOR.sql
ATIVO_030_AUXILIAR.sql
ATIVO_030_CONTROLE.sql
ATIVO_030_NEGOCIO.sql
...
Objetivo
Escolha uma pasta ou crie uma para armazenar seu softwares em Java que trarão produtividade para o seu prompt, Ex: C:\JAVA_LIB
Eu acreditava que era possível colocar apenas o .java na pasta e usar, pensava que ao chamar
java SeparaArquivos.java
tudo iria funcionar.
Não dá certo, tem que converter para bytecodes, gerando o arquivo .class
Então dentro da pasta C:\JAVA_LIB se ainda não possui o .class, dê o comando
javac SeparaArquivos.java
Será gerado um arquivo com a extensão .class, no meu caso em particular
SeparaArquivos.class
Inclua na variável de ambiente CLASSPATH o caminho C:\JAVA_LIB
Basta chamar
java SeparaArquivos
Pronto! Chame seu programa Java a partir de qualquer diretório sempre que precisar processar algo.
Claro, o seu Java deve estar instalado corretamente.
Java roda em Linux, as possibilidades são infinitas.
Java é mais poderoso que um arquivo .bat e este não é compatível com Linux.
E eu particularmente acho o código Java muito mais fácil que o de um .bat
Fonte do programa
import java.io.*;
import java.nio.file.*;
import java.util.regex.*;
public class SeparaArquivos {
public static void main(String[] args) {
String pastaOrigem = System.getProperty("user.dir");
String pastaDestino = System.getProperty("user.dir");
moverArquivos(pastaOrigem, pastaDestino);
}
public static void moverArquivos(String pastaOrigem, String pastaDestino) {
File diretorioOrigem = new File(pastaOrigem);
File[] arquivos = diretorioOrigem.listFiles();
if (arquivos != null) {
for (File arquivo : arquivos) {
if (arquivo.isFile() && arquivo.getName().toLowerCase().endsWith(".sql") ) {
String nomeArquivo = arquivo.getName();
String numero = extrairNumero(nomeArquivo);
if (numero != null) {
File novaPasta = new File(pastaDestino + File.separator + numero);
if (!novaPasta.exists()) {
novaPasta.mkdirs();
}
try {
Path origem = arquivo.toPath();
Path destino = new File(novaPasta.getPath() + File.separator + nomeArquivo).toPath();
Files.move(origem, destino, StandardCopyOption.REPLACE_EXISTING);
System.out.println("Arquivo " + nomeArquivo + " movido para a pasta " + numero);
} catch (IOException e) {
System.out.println("Erro ao mover o arquivo " + nomeArquivo);
}
}
}
}
}
}
public static String extrairNumero(String nomeArquivo) {
String numero = null;
Pattern pattern = Pattern.compile("_(\\d+)_");
Matcher matcher = pattern.matcher(nomeArquivo);
if (matcher.find()) {
numero = matcher.group(1);
}
return numero;
}
}
Esse código dá para melhorar muito, está assim porque pedi o auxílio do ChatGPT.
Meu foco era organizar os arquivos o mais rápido possível e não criar o melhor separador de arquivos do mundo.
Um simples exemplo if(arquivos != null) não precisa aninhar.
Eu já daria um return if(arquivos == null){ return }