I am assuming that you are running this application under Windows operating systems family (otherwise you will have to adapt it a little bit). The Runtime.exec()
method is used to execute executable commands. It is not the case with dir,
cd,
copy,
... As a consequence of this it triggers an exception which is what you are experiencing.
The cd
command is part of the windows command interpreter cmd.
It can either be executed with command.com
or cmd.exe
depending on the version of the operating system.
Therefore we should run the command interpreter first and feed it the user - supplied command (such as dir,
cd,
copy,
...)
Here is a program that does that. It checks the os.name
environment variable in order to select the right command interpreter. I test for Windows NT and Windows 95. If none of these two is found but is still a Windows operating system, then I assume it is a modern windows (such as Windows 7 or Windows 8) and it is using cmd.exe.
import java.util.*;
import java.io.*;
class StreamGobbler extends Thread
{
InputStream is;
String type;
StreamGobbler(InputStream is, String type)
{
this.is = is;
this.type = type;
}
public void run()
{
try
{
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line=null;
while ( (line = br.readLine()) != null)
System.out.println(type + ">" + line);
} catch (IOException ioe)
{
ioe.printStackTrace();
}
}
}
public class GoodWindowsExec
{
public static void main(String args[])
{
if (args.length < 1)
{
System.out.println("USAGE: java GoodWindowsExec <cmd>");
System.exit(1);
}
try
{
String osName = System.getProperty("os.name" );
System.out.println("OS NAME IS " + osName);
String[] cmd = new String[3];
if( osName.equals( "Windows NT" ) )
{
cmd[0] = "cmd.exe" ;
cmd[1] = "/C" ;
cmd[2] = args[0];
}
else if( osName.equals( "Windows 95" ) )
{
cmd[0] = "command.com" ;
cmd[1] = "/C" ;
cmd[2] = args[0];
} else if (osName.toUpperCase().trim().contains("WINDOWS")) {
cmd[0] = "cmd.exe" ;
cmd[1] = "/C" ;
cmd[2] = args[0];
}
Runtime rt = Runtime.getRuntime();
System.out.println("Execing " + cmd[0] + " " + cmd[1]
+ " " + cmd[2]);
Process proc = rt.exec(cmd);
// any error message?
StreamGobbler errorGobbler = new
StreamGobbler(proc.getErrorStream(), "ERROR");
// any output?
StreamGobbler outputGobbler = new
StreamGobbler(proc.getInputStream(), "OUTPUT");
// kick them off
errorGobbler.start();
outputGobbler.start();
// any error???
int exitVal = proc.waitFor();
System.out.println("ExitValue: " + exitVal);
} catch (Throwable t)
{
t.printStackTrace();
}
}
}
Here is a Simple runner for this class
public class GoodWindowsExecRunner {
public static void main(String[] args) {
//GoodWindowsExec.main(new String[] {"dir *.*"});
GoodWindowsExec.main(new String[] {"cd .."});
}
}
Here is the result from executing the "cd .." command

Here is the result from executing a "dir ." command

There is an excellent article on java world called When Runtime.exec won't