programmieren-in-rust/aufgaben/sheet07/task4/README.md

41 lines
1.9 KiB
Markdown
Raw Normal View History

2016-12-07 01:32:26 +01:00
Aufgabe 4: Kopierbefehl
=======================
(*In dieser Aufgabe geht es nicht mehr unbedingt nur um Iteratoren!*)
In dieser Aufgabe sollt ihr den `cp` Befehl nachprogrammieren ... Ok, nur einen Teil davon.
Euer Programm soll zwei Dateinamen als *command line parameter* erhalten und dann von der einen Datei in die andere kopieren:
```
$ mycp Cargo.toml Peter.toml
```
Euer Programm soll also `mycp` heißen!
Wenn ihr es richtig gemacht habt, könnt ihr mit dem Befehl `cargo install` euer Programm global auf eurem System installieren (die Executable wird in `~/.cargo/bin` kopiert, welches im `$PATH` ist). Damit ihr es aber nicht immer neu installieren müsst, um es auszuprobieren, könnt ihr es aber natürlich mit `cargo run` testen. Die Kommandozeilenparameter werden nach den `--` übergeben:
```
$ cargo run -- Cargo.toml Peter.toml
```
Die Hauptschritte zur Implementation sind folgende:
### a) Parsen der Kommandozeilenparameter
Diese müssen zunächst eingelesen werden und auf Gültigkeit überprüft werden (richtige Anzahl?).
Dies soll in einer eigenen Funktion geschehen, in der *keine* Ausgabe auf dem Terminal geschehen soll.
Alle Informationen müssen im Rückgabewert kodiert sein.
Hierzu ist sicherlich das [`std::env` Modul](https://doc.rust-lang.org/std/env/index.html) interessant.
### b) Kopieren des Dateiinhalts
Falls die Parameter korrekt waren, muss jetzt von einer Datei in die andere kopiert werden.
Das soll ebenfalls in einer eigenen Funktion passieren, welche *keine* Ausgaben auf dem Terminal macht.
Dabei sollten natürlich auch Fehler behandelt werden.
Das heißt aber nicht, dass ihr selber viel Code programmieren müsst; wahrscheinlich ist die Implementierung kürzer, als ihr anfangs vermuten würdet.
Wie man schon vermutet, wird hier das [`std::io` Modul](https://doc.rust-lang.org/std/io/index.html) eine Rolle spielen.
Nur die Funktion `std::fs::copy()` dürft ihr **nicht** nutzen! Das wäre ja zu einfach ;-)