在java程序开发中,有用到getRuntime().exec()调用copy、xcopy命令,其中碰到一些问题,记录如下:
1.用getRuntime().exec()调用copy:
java.lang.Runtime.getRuntime().exec("cmd.exe /c copy C:\\cubeETL_TEST\\cog\\buildDir\\231.mdc C:\\cubeETL_TEST\\cog\\publish1\\231.mdc");
以上的写法经测试是可以正确copy的。
在写程序的过程中,先碰到的是这样一种情况,写法如下:
java.lang.Runtime.getRuntime().exec("cmd.exe /c copy C:/cubeETL_TEST/cog/buildDir/231.mdc C:/cubeETL_TEST/cog/publish1/231.mdc");
与上面一种写法的差别就是文件路径中是使用“\”还是“/”,在windows 2000系统上测试的结果是,路径写成C:\\cubeETL_TEST\\cog\\buildDir\\231.mdc,则能正确copy文件;若写成C:/cubeETL_TEST/cog/buildDir/231.mdc,程序也能运行,且不报任何错误,但是文件却没有copy成功。
2.使用getRuntime().exec()调用copy时,若直接写成:
java.lang.Runtime.getRuntime().exec("copy C:\\cubeETL_TEST\\cog\\buildDir\\231.mdc C:\\cubeETL_TEST\\cog\\publish1\\231.mdc");
程序运行时会产生异常信息:
java.io.IOException: CreateProcess: copy C:\cubeETL_TEST\cog\buildDir\231.mdc C:\cubeETL_TEST\cog\publish1\231.mdc error=2
3.用getRuntime().exec()调用xcopy:
可以正确执行的写法如下:
java.lang.Runtime.getRuntime().exec("cmd.exe /c xcopy C:\\cubeETL_TEST\\cog\\buildDir\\231 C:\\cubeETL_TEST\\cog\\publish1\\231\\");
文件夹层次说明:
buildDir下存在文件夹231,publish1下不存在文件夹231.
首先说明这么写的含义:是将buildDir下的文件夹231拷贝到文件夹publish1下。
首先要注意的是因为文件夹publish1下原没有文件夹231(若有,那就又变成相当于调用copy命令拷贝文件了),所以在写源目录、目标目录时需注意:
源目录路径后面不要带“\”,而目标路径后面需要带“\”。这样文件夹231(文件及子文件夹)就能正确复制到publish1文件夹下。
如果写成这样的格式:
java.lang.Runtime.getRuntime().exec("cmd.exe /c xcopy C:\\cubeETL_TEST\\cog\\buildDir\\231 C:\\cubeETL_TEST\\cog\\publish1\\231");
在java程序中运行后,程序无错误提示,但是文件夹不能正确拷贝;直接在cmd中执行这样的命令:
xcopy C:\cubeETL_TEST\cog\buildDir\231 C:\cubeETL_TEST\cog\publish1\231
运行后后出现和下图一样的提示:
(在本机测试的目录结构,
C:\temp下没有xml文件夹)
输入D回车,命令将把文件夹buildDir下的子文件夹231拷贝到publish1文件夹下;
若在cmd中执行如下的命令:
xcopy C:\temp\cog\xml\ C:\temp\xml\
运行后将提示,无效路径 复制了0个文件,如下图