Sie könnten den Befehl ausführen und die err
Ausgabe, die eine aussagekräftige Nachricht enthält.
Hier ist ein minimaler ausführbarer Code (der die apache commons-exec ), die zeigt, wie dies funktionieren könnte:
import org.apache.commons.exec.*;
public static String getErrorMessage(String command) {
CommandLine cmdLine = CommandLine.parse(command);
DefaultExecutor executor = new DefaultExecutor();
ByteArrayOutputStream out = new ByteArrayOutputStream();
ByteArrayOutputStream err = new ByteArrayOutputStream();
executor.setStreamHandler(new PumpStreamHandler(out, err));
try {
executor.execute(cmdLine);
} catch (Exception e) {
return err.toString().trim();
}
return null; // no error occurred
}
Hier ist ein Test dieses Codes, der eine Reihe von Fehlern bei der Dateioperation zeigt:
public static void main(String[] args) throws Exception {
System.out.println(getErrorMessage("cp fake.file x"));
System.out.println(getErrorMessage("cp /tmp /tmp"));
System.out.println(getErrorMessage("mkdir /Volumes"));
System.out.println(getErrorMessage("mv /tmp /"));
System.out.println(getErrorMessage("mv fake.file /tmp"));
}
Ausgabe (unter Mac OSX):
cp: fake.file: No such file or directory
cp: /tmp is a directory (not copied).
mkdir: /Volumes: File exists
mv: /tmp and /tmp are identical
mv: rename fake.file to /tmp/fake.file: No such file or directory
Sie könnten die obige Methode in eine Methode verpacken, die eine IOException auslöst, die nach Erhalt der Nachricht diese nach den Schlüsselparametern analysiert und die Nachrichten mithilfe von Regex-Matching oder contains
zu bestimmten IOExceptions und werfen sie, z.B.:
if (message.endsWith("No such file or directory"))
throw new FileNotFoundException(); // Use IOExceptions if you can
if (message.endsWith("are identical"))
throw new IdenticalFileException(); // Create your own Exceptions that extend IOException
Wenn Sie dies für die Verwendung auf mehreren Betriebssystemen abstrahieren wollten, müssten Sie Code für jede Plattform implementieren (Windows und *nix verwenden unterschiedliche Shell-Befehle/Fehlsmeldungen für eine bestimmte Dateioperation/ein bestimmtes Ergebnis).
Wenn die Prämie für diese Antwort vergeben wird, werde ich eine vollständige, aufgeräumte Version des funktionierenden Codes posten, einschließlich eines schicken enum
für Dateioperationen.