Gyakorlati alapok II.
Konzol a konzolban alapszintű parancsokkal
Ebben a rövid, de érdekes fejezetben néhány jellegzetes filekezelő függvényt a
gyakorlatban is felhasználunk. Készítünk egy egyszerű virtuális konzolt (Command
prompt): előre definiált parancsok fogják meghívni ezen filekezelő
függvényeket, természetesen már külön metódusos elrendezésben.
Ezek a következők lesznek:
-
mkdir – könyvtár létrehozása,
-
ls – könyvtár rövid tartalmi listája,
-
lsf – könyvtár részletes tartalmi listája,
-
del – könyvtár vagy file törlése,
-
exit – kilépés a virtuális konzolból (programból).
Nyilvánvalóan a parancsok (instruction) önmagukban nem elégségesek a műveletek elvégzéséhez, ehhez legtöbbször további 2 bemeneti adatra is szükség van:
-
file vagy állománynév (name),
-
elérési út (path).
Ezek standard sorrendje, amely
gépeléskor kötelezően tartandó, a következő:
parancs
szóköz név szóköz elérési út
Például a proba nevű könyvtár létrehozása a D: meghajtón:
mkdir proba D:/
A bekért bemeneti String-objektumot (args) a szóköz karakter mentén egy split() metódus bontja fel instruction-name-path String-komponensekre. Ezután a komponensek pontos megadása hívja meg a parancsok mögött lévő függvényeket:
-
mkdir – makingDirectory(),
-
ls – listingShort(),
-
lsf – listingFull(),
-
del – deleteDirectory(),
-
exit – exit().
A program a file-műveletekkel kapcsolatos legáltalánosabb működési és validálási szabályokat képes lekezelni (létrehozva, törölve, létezik, nem létezik, már létezik, stb.), de korántsincs minden egyes szabályra-helyzetre felkészítve!
Például az elérési út hiánya esetén a konzol a Java-programot futtató projekt
munkakönyvtárában fog dolgozni, illetve egyéb hiányosságok vagy
Bad command parancsot vagy nem tesztelt
hibaüzeneteket fognak generálni. (Láthatóan a
kivételkezelést sem kezeltük le
-> throws IOException).
Ám ellenpéldaként említhetjük a deleteDirectory()
metódust, amelyben a felhasznált delete() metódus
alapértelmezésben nem fogja törölni a nem üres könyvtárakat, ezért a kötelező
törlési rutinon felül egy olyan
szubrutint is be kellett beilleszteni, amelyik képes erre.
Itt kell tehát megjegyeznünk, hogy már ez az 5 alapszintű parancs is olyan
mennyiségű ellenőrzési-validálási munkát szabadított fel, amelyet a magam
részéről csak alapszinten végeztem el, ám amelyet a Tisztelt Olvasó saját
fejlődése céljából a jelen projektben bármikor tovább folytathat.
Nézzük meg a futtatható Java-kódot:
import java.io.File;
import java.io.IOException;
import java.util.Scanner;
public class Main {
static String args;
static String instruction;
static String path;
static String name;
static Scanner scanner = new Scanner(System.in);
public static void main(String[] arguments) throws IOException {
while(true) {
path = "";
instruction = "";
name = "";
System.out.println("Command prompt:");
args = scanner.nextLine();
int countGap = 0;
for(int i = 0; i < args.length(); i++) {
if(args.charAt(i) == ' ') {
countGap++;
}
}
if(countGap == 0) {
if(args.equals("exit")) {
exit();
}
else
badCommand();
continue;
}
else if(countGap == 1) {
String argsToken2[] = new String[2];
argsToken2 = args.split(" ", 2);
instruction = argsToken2[0];
name = argsToken2[1];
path = ".";
}
else if(countGap == 2) {
String argsToken3[] = new String[3];
argsToken3 = args.split(" ", 3);
instruction = argsToken3[0];
name = argsToken3[1];
path = argsToken3[2];
}
if(instruction.equals("mkdir")) {
makingDirectory();
continue;
}
if(instruction.equals("del")) {
deleteDirectory();
continue;
}
if(instruction.equals("ls")) {
listingShort();
continue;
}
if(instruction.equals("lsf")) {
listingFull();
continue;
}
else
badCommand();
}
}
static void badCommand() {
System.out.println("\nBad command\n");
}
static void exit() {
System.out.println("\nViszlat!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println("System
failure!");
}
scanner.close();
System.exit(0);
}
static void deleteDirectory() {
File file = new File(path, name);
if(!file.exists()){
System.out.println("The deleting
file/directory does not exist\n");
return;
}
if(file.isDirectory()) {
removeDirectory(file);
System.out.println("The directory has
been deleted\n");
return;
}
else
file.delete();
System.out.println("The file has been deleted\n");
}
public static void removeDirectory(File dir) {
if (dir.isDirectory()) {
File[] files = dir.listFiles();
if (files !=
null && files.length > 0) {
for (File aFile : files) {
removeDirectory(aFile);
}
}
dir.delete();
} else {
dir.delete();
}
}
static void makingDirectory() {
File file = new File(path, name);
if(!file.exists()){
boolean result = file.mkdir();
if(result){
System.out.println("Successfully created " + file.getPath()+ "\n");
}
else{
System.out.println("Failed creating " + file.getPath() + "\n");
}
}else{
System.out.println("Pathname already exists\n");
}
}
static void listingShort() throws IOException {
System.out.println();
for(File f : new File(path).listFiles()) {
System.out.println(f.getName());
}
System.out.println();
}
static void listingFull() throws IOException {
System.out.println();
for (File f : new File(path).listFiles()) {
if(f.isFile()) {
System.out.println("(File) " + f.getName() + " - with size of " + f.length() +
" bytes");
}else if(f.isDirectory()) {
System.out.println("(Directory) " + f.getName() + " - with
size of " + f.length() + " bytes");
}
}
System.out.println();
}
}
Végeredmény:
Command
prompt:
mkdir proba.txt D:/
Successfully created D:\proba.txt
Command prompt:
del proba.txt D:/
The directory has been deleted
Command prompt:
lsf Java D:/Java
(Directory) eclipse - with size of 4096 bytes
(Directory) Projects - with size of 8192 bytes
Command prompt:
ls Java D:/Java
eclipse
Projects
Command prompt:
ls
Bad command
Command prompt:
fg
Bad command
Command prompt:
exit
Viszlat!