Я хотел знать, как создать программу на C ++ или java с использованием классов объектов, способных реализовывать следующие функции:
string pwd()
: вернуть полный путь из корня в том же формате, что и Unix.
void ls()
: отображает каждый файл, каталог или ссылку в текущем каталоге на экране, по одному в каждой строке.
void cd(string path)
: изменить путь к другому каталогу, он может быть к родительскому каталогу (path=".."
), к текущему каталогу (path="."
), к каталогу от корня ( path="/...."
) или подкаталог текущего каталога.
void stat(string elemento)
: отображает размер файла, каталога или ссылки, передаваемых в качестве параметра на экране, путь также может быть передан другому элементу в другом каталоге.
void vim(string file, int tamanyo)
: Измените размер файла только в пределах текущего пути, если он не существует, создайте его снова.
void mkdir(string directorio)
: Создать каталог только по текущему пути.
void ln(string origen, string destino)
: создать ссылку с именем «destination», которая ссылается на элемент источника, «destination» может быть не полным путем, а «origin», да, это элемент » Происхождение "может быть в другом каталоге.
void rm(string elemento)
: удалить элемент в текущем маршруте или вы можете указать полный путь, если это файл, удалить его напрямую, если это ссылка, удалить ссылку, но он не связан, и если это каталог, он удаляет каталог со всем его содержимым.
Должно быть 4 разных класса: Directorio
, Archivo
, Enlace
и Ruta
(конструктор будет каталогом, который будет действовать в корне).
Все вышеперечисленные операции используются в классе Ruta
.
Основной файл уже сделан как на c ++, так и на java, только реализация классов будет отсутствовать, здесь я присоединяю оба.
C ++:
#include <string>
#include <vector>
#include <iostream>
#include <sstream>
#include "ruta.h"
using namespace std;
int main()
{
Directorio raiz("");
Ruta ruta(raiz);
for (bool done=false; !done; )
{
string line,arg;
vector<string> cmd;
cout << "~> " << flush;
getline(cin,line);
istringstream iss(line);
while(getline(iss,arg,' ')) cmd.push_back(arg);
if (cin.eof())
{
done = true;
continue;
}
if (cmd.size()<1)
continue;
try
{
if (cmd[0]=="pwd")
{
cout << ruta.pwd() << endl;
}
if (cmd[0]=="ls")
{
ruta.ls();
}
if (cmd[0]=="cd")
{
ruta.cd(cmd.at(1));
}
if (cmd[0]=="stat")
{
if (cmd.size()>1)
ruta.stat(cmd.at(1));
else
ruta.stat(".");
}
if (cmd[0]=="vim")
{
ruta.vim(cmd.at(1),atoi(cmd.at(2).c_str()));
}
if (cmd[0]=="mkdir")
{
ruta.mkdir(cmd.at(1));
}
if (cmd[0]=="ln")
{
ruta.ln(cmd.at(1),cmd.at(2));
}
if (cmd[0]=="rm")
{
ruta.rm(cmd.at(1));
}
if (cmd[0]=="exit")
{
done = true;
}
}
catch (arbol_ficheros_error& e)
{
cerr << e.what() << endl;
}
catch (out_of_range& e)
{
cerr << e.what() << endl;
}
}
cout << endl;
return 0;
}
Java:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
class Main {
public static void main(String[] args) {
Directorio raiz;
Ruta ruta;
try {
raiz = new Directorio("");
ruta = new Ruta(raiz);
} catch (ExcepcionArbolFicheros e) { return; }
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
boolean end = false;
while (!end)
{
System.out.print(ruta.pwd()+"> ");
try {
String[] argv = br.readLine().split(" ");
if (argv[0].equals("pwd")) {
System.out.println(ruta.pwd());
} else if (argv[0].equals("ls")) {
ruta.ls();
} else if (argv[0].equals("cd")) {
ruta.cd(argv[1]);
} else if (argv[0].equals("stat")) {
if (argv.length > 1) ruta.stat(argv[1]);
else ruta.stat(".");
} else if (argv[0].equals("vim")) {
ruta.vim(argv[1], Integer.parseInt(argv[2]));
} else if (argv[0].equals("mkdir")) {
ruta.mkdir(argv[1]);
} else if (argv[0].equals("ln")) {
ruta.ln(argv[1],argv[2]);
} else if (argv[0].equals("rm")) {
ruta.rm(argv[1]);
} else if (argv[0].equals("exit")) {
end = true;
} else {
System.out.println("Comando desconocido");
}
} catch(ExcepcionArbolFicheros e) {
System.out.println(e);
} catch(IOException e) {
System.out.println("Error de entrada-salida");
} catch (java.lang.ArrayIndexOutOfBoundsException e) {
System.out.println("Error sintactico: parametros insuficientes");
}
}
}
};
Добро, я не думаю, что разрешение проблемы должно осуществляться посредством призывов к операционной системе призывая в соответствующую команду (то же самое я спутан), между другими вещами, потому что, если Java портативный, команды между операционными системами это не, и следовательно было бы нужно стараться реализовывать функциональность посредством использования Java.
Независимый от этого я предлагаю тебе следующие классы, как они требуют у тебя, даже больше.
Класс Маршрут, представь path в каталог, файл или ссылку и он неизменный, а именно, однажды созданная не возможно изменять, он создается начиная с объекта String. Было бы возможно добавлять какое-то утверждение.
public class Ruta {
private final String path;
public Ruta(String path) {
this.path=path;
}
public String getPath() {
return path;
}
}
Все остальные классы увеличивают класса AbstractFileBase, меньше уже прокомментированный класс Маршрут. У всех есть общий строитель, метод rm (), что функционирует равно для всех, так как Каталог, Файл или Ссылка удаляют из той же формы и абстрактного метода stat (), у которого есть различное осуществление в каждом случае, был бы чем-либо подобным:
public abstract class AbstractFileBase {
protected File file;
public AbstractFileBase(Ruta ruta) {
file=new File(ruta.getPath());
}
public void rm(Ruta ruta) {
file=new File(ruta.getPath());
if(file.exists()) {
file.delete();
}
}
public abstract String stat() throws IOException;
}
Класс Каталог осуществляет собственные методы:
public class Directorio extends AbstractFileBase {
public Directorio(Ruta ruta) {
super(ruta);
}
public String pwd() throws IOException {
return file.getCanonicalPath();
}
public void mkdir(String path) {
// :TODO
}
public List<String> ls() {
List<String> files=new ArrayList<String>();
for(File file:file.listFiles()) {
if(file.isDirectory()) {
files.add("d - "+file.getName());
}
else {
files.add("f - "+file.getName());
}
}
return files;
}
public String cd(Ruta ruta) throws IOException {
file=new File(ruta.getPath());
return pwd();
}
@Override
public String stat() throws IOException {
// :TODO aqui crear la informacion estadistica que se desee
return "Soy un directorio";
}
}
Класс Файл осуществляет собственные методы:
public class Archivo extends AbstractFileBase {
public Archivo(Ruta ruta) {
super(ruta);
}
@Override
public String stat() throws IOException {
// :TODO aqui crear la informacion estadistica que se desee
return "Soy un directorio";
}
public void vim(String path,int size) throws IOException {
// :TODO creo que con la versión Java 7 de File es fácil de implementar
}
}
Класс Соединил осуществи собственные методы:
public class Enlace extends AbstractFileBase {
public Enlace(Ruta ruta) {
super(ruta);
}
public void ln(String newDirectory) {
// :TODO
}
@Override
public String stat() throws IOException {
// :TODO aqui crear la informacion estadistica que se desee
return "Soy un directorio";
}
}
PodrГ-схвати использовать следующий класс
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class ExecuteShellComand {
public String executeCommand(String command) {
StringBuffer output = new StringBuffer();
Process p;
try {
p = Runtime.getRuntime().exec(command);
p.waitFor();
BufferedReader reader =
new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = "";
while ((line = reader.readLine())!= null) {
output.append(line + "\n");
}
} catch (Exception e) {
e.printStackTrace();
}
return output.toString();
}
}
и чтобы использовать эти функции оно было бы чем-то asГ-:
ExecuteShellCommand executor = new ExecuteShellCommand();
// para pwd
executor.executeCommand("pwd");
//para ls
executor.executeCommand("ls");
// etc etc...
Сейчас только ты должен создавать классы, о которых ты упоминаешь, и выполнять команды, как mostrГ© достигает
Шрифт: http://www.mkyong.com/java/how-to-execute-shell-command-from-java/
Что советовал тебе иметь txt и в каждой линии этого иметь команду shell, в момент ввождения ввода в компьютер ты сравниваешь с каждой линией txt с этим примером http://www.mkyong.com/java/how-to-read-file-from-java-bufferedreader-example/ и чтобы выполнять команду в java
Runtime rt = Runtime.getRuntime();
Process pr = rt.exec("java -jar map.jar time.rel test.txt debug");