这个方法改进了上一篇的。请各位人事看到后给点评论和意见,看我还有哪些没考虑到的。这个代码不是很完整只是其中最重要的部分把它粘贴出来了。
//上传多个文件夹(文件夹中还有文件夹)
这里我再次重申一遍,这里写的时候一定要带后面的\\,即是"D:\\hellosite2\\",而不是"D:\\hellosite2"。这点非常重要。一定要切记。另外这个也只适用于Windows的环境下,在Linux下面我正在研究,等出来后我把它粘贴出来。
//uploadManyFile(ftpClient,new File("D:\\helloSite2\\"),"D:\\helloSite2\\");
//第三个参数localPath是非常重要的,它是我在解决最困难问题时想到的这个解决办法,它可以定位到我程序该什么时候再次跳到上层目录中起到了关键性作用,用它来和现在的目录相比,然后再跳。这段话只是写给我自己看的,呵呵,以免我自己都忘记。
最核心的代码:
//上传多个文件夹(文件夹中还有文件夹)
//uploadManyFile(ftpClient,new File("D:\\helloSite2\\"),"D:\\helloSite2\\");
//第二和第三个参数的写法,都必须是后面都带上\\的,否则不成功的。
public void uploadManyFile(FTPClient ftpClient,File localFilePath,String localPath,String webSiteName){
try{
System.out.println(localFilePath.getName()+"*******");
File fileList[] = localFilePath.listFiles();
//判断是否是空目录
if(fileList.length <= 0){
ftpClient.changeToParentDirectory();
for(int m=0;m<AbsolutePathList.size();m++){
for(int k=0;k<AbsolutePathList.size();k++){
String target = AbsolutePathList.get(k).substring(localPath.length()-1, AbsolutePathList.get(k).length());
int sign = target.lastIndexOf(fileName.get(k));
String finalTarget = target.substring(0, sign-1);
String ftpWorkingPath = ftpClient.printWorkingDirectory();
if(ftpWorkingPath.length() > webSiteName.length()){
int firstIndex = ftpWorkingPath.indexOf(webSiteName);
ftpWorkingPath = ftpWorkingPath.substring(firstIndex+webSiteName.length(), ftpWorkingPath.length());
}
ftpWorkingPath = ftpWorkingPath.replace("/", "\\");
System.out.println("target="+target+" sign="+sign+" finalTarget="+finalTarget);
System.out.println("ftpWorkingPath="+ftpWorkingPath);
if(finalTarget.equals(ftpWorkingPath)){
System.out.println("zaitiao");
ftpClient.changeToParentDirectory();
}
}
}
}
for(int i=0;i<fileList.length;i++){
File upfile = (File)fileList[i];
if(upfile.isDirectory()){
System.out.println(upfile.getName()+"---");
System.out.println("jinlai");
if(i+1 == fileList.length){
System.out.println("aa3-absolute="+upfile.getAbsolutePath());
AbsolutePathList.add(upfile.getAbsolutePath());
fileName.add(upfile.getName());
}
ftpClient.makeDirectory(upfile.getName());
ftpClient.changeWorkingDirectory(upfile.getName());
uploadManyFile(ftpClient,upfile,localPath,webSiteName);
}else{
System.out.println(localFilePath.getName()+"****&&***");
System.out.println(upfile.getName()+"--+++");
System.out.println(localFilePath.getPath()+"\\"+upfile.getName());
String localFileRealPath = localFilePath.getPath()+"\\"+upfile.getName();
uploadRealFile(ftpClient,new File(localFileRealPath));
System.out.println("i="+ i);
System.out.println("fileList.length="+fileList.length);
if(i+1 == fileList.length){
ftpClient.changeToParentDirectory();
for(int m=0;m<AbsolutePathList.size();m++){
for(int k=0;k<AbsolutePathList.size();k++){
String target = AbsolutePathList.get(k).substring(localPath.length()-1, AbsolutePathList.get(k).length());
int sign = target.lastIndexOf(fileName.get(k));
String finalTarget = target.substring(0, sign-1);
String ftpWorkingPath = ftpClient.printWorkingDirectory();
if(ftpWorkingPath.length() > webSiteName.length()){
int firstIndex = ftpWorkingPath.indexOf(webSiteName);
ftpWorkingPath = ftpWorkingPath.substring(firstIndex+webSiteName.length(), ftpWorkingPath.length());
}
ftpWorkingPath = ftpWorkingPath.replace("/", "\\");
System.out.println("target="+target+" sign="+sign+" finalTarget="+finalTarget);
System.out.println("ftpWorkingPath="+ftpWorkingPath);
if(finalTarget.equals(ftpWorkingPath)){
System.out.println("zaitiao");
ftpClient.changeToParentDirectory();
}
}
}
}
System.out.println("i==++=="+i);
}
}
}catch(Exception e){
e.printStackTrace();
}
}
下面这个代码可以和上面那个结合起来,用来发布自己可以重新命名的文件到FTP服务器上。
public void createDirectoryName(String webSiteName,FTPClient ftpClient,File localFilePath,String localPath){
try{
ftpClient.makeDirectory(webSiteName);
ftpClient.changeWorkingDirectory(webSiteName);
uploadManyFile(ftpClient,localFilePath,localPath,webSiteName);
}catch(IOException e){
e.printStackTrace();
}
}