Индексирование в обратном направлении защитит вас от слишком раннего поиска существующего файла в таких случаях:
Вы можете добавить исполняемые суффиксы при тестировании для File.exists, чтобы захватывать подобные ipconfig.exe из ipconfig.
Вы, вероятно, не захотите этого делать, но вы, наконец, можете попробовать выполнить полученную строкупроверить, если это исполняемый файл.Это было бы довольно опасно делать с произвольным вводом.
public class Example
{
public static void main(String[] args)
{
String[] samples = {
"C:\\windows\\system32\\notepad.exe bla.txt",
"C:\\WINDOWS\\system32\\ipconfig /all",
System.getProperty("user.home") + " foo bar"
};
for (String s: samples) {
File f = getFile(s, new String[]{"exe", "cmd"});
System.out.println(f);
// you probably don't want to do this
Process p = null;
try {
p = Runtime.getRuntime().exec(f.toString());
} catch (IOException e) {
System.err.println("Not executable: " + f);
} finally {
if (p != null) {
p.destroy();
}
}
}
}
public static File getFile(String cmd, String[] suffixes)
{
StringBuilder buffer = new StringBuilder(cmd);
while(true) {
File f = new File(buffer.toString());
if (f.exists()) {
return f;
} else {
for (String suffix: suffixes) {
f = new File(f.toString() + "." + suffix);
if (f.exists()) {
return f;
}
}
}
int start = buffer.lastIndexOf(" ");
if (start <= 0) {
break;
}
buffer.delete(start, buffer.length());
}
return null;
}
}