C ++ или Java программа, которая работает как интерпретатор команд Unix?

Я хотел знать, как создать программу на 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");
        }
     }
   }
};
-1
задан 11.04.2016, 22:08
3 ответа

Добро, я не думаю, что разрешение проблемы должно осуществляться посредством призывов к операционной системе призывая в соответствующую команду (то же самое я спутан), между другими вещами, потому что, если 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";
  }

}
  • В конце концов комментировать тебе, что, если с классом File JDK ты не можешь осуществлять все попросившие методы, ты можешь пробовать это с FileUtils Апачи Commons IO
  • Для твоего класса Main ты можешь создавать приложение к стилю CLI (Комманд Лине Интерфейс) очень простой формы используя книжный магазин Апачи Commons CLI
1
ответ дан 24.11.2019, 14:36
  • 1
    Большое спасибо est и # 225; очень хорошо! Это и #250; nico, что не нужно делать это действительно работая с операционной системой, а используя виртуальную среду, а именно, не существуют действительно каталоги, только в программе. И s и # 237; что est и # 225; позволенный в и # 241; adir классы, чтобы помогать, much и # 237; пропасти спасибо! – Elena Saura 12.04.2016, 02:40
  • 2
    Я тебе благодарен много за комментарий, если не является много ты просить просить и # 237; которому ты давал из-за хорошего или голосовал за ответ как правильная, спасибо. – Ipman1971 14.04.2016, 02:25

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/

0
ответ дан 24.11.2019, 14:36

Что советовал тебе иметь 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");
0
ответ дан 24.11.2019, 14:36

Теги

Похожие вопросы