2010-11-02 37 views
13

Có sẵn chức năng sẵn có cho Java để tạo cấu trúc phân cấp thư mục trên máy chủ FTP từ xa hay không. Apache Commons cung cấp một máy khách FTP, nhưng tôi không thể tìm thấy một phương thức để tạo ra một hệ thống phân cấp thư mục. Nó cho phép tạo một thư mục duy nhất (makeDirectory), nhưng việc tạo một đường dẫn toàn bộ dường như không có trong đó. Lý do tôi muốn điều này là bởi vì đôi khi một phần của một hệ thống phân cấp thư mục không phải là (chưa) và trong trường hợp này tôi muốn tạo phần còn thiếu của hệ thống phân cấp và sau đó thay đổi thư mục mới được tạo.Tạo phân cấp thư mục qua FTP trong Java

Trả lời

19

Bạn phải sử dụng một sự kết hợp của FTPClient.changeWorkingDirectory để tìm ra nếu thư mục tồn tại, sau đó FTPClient.makeDirectory nếu cuộc gọi đến FTPClient.changeWorkingDirectory lợi nhuận false.

Bạn cần phải đệ quy đi bộ cây thư mục theo cách được mô tả ở trên ở mỗi cấp tạo thư mục theo yêu cầu.

+0

Trên thực tế đó là những gì tôi hình dung. Về cơ bản đó là tạo ra phiên bản mkdir của riêng bạn, nhưng đối với FTP. – Pieter

1

Tại sao bạn không thể sử dụng phương thức FTPClient # makeDirectory() để tạo cấu trúc phân cấp, một thư mục tại một thời điểm?

2

Apache Commons VFS (Virtual File System) có thể truy cập vào hệ thống tập tin khác nhau (FTP trong số đó), và nó cũng cung cấp một phương pháp createFolder đó là khả năng tạo ra các thư mục mẹ nếu cần thiết:

http://commons.apache.org/vfs/apidocs/org/apache/commons/vfs/FileObject.html#createFolder%28%29

Tài liệu nói rằng phương thức "tạo thư mục này, nếu nó không tồn tại. Cũng tạo ra bất kỳ thư mục tổ tiên nào không tồn tại. Phương pháp này không làm gì nếu thư mục đã tồn tại."

Điều này có thể phù hợp với nhu cầu của bạn.

+0

Vâng, tôi đã đọc về điều đó. Rất tiếc, tôi không thể sử dụng thư viện này vì nó không có sẵn trên hệ thống đích. – Pieter

25

Cần câu trả lời cho điều này và vì vậy tôi đã triển khai và thử nghiệm một số mã để tạo thư mục khi cần. Hy vọng điều này sẽ giúp một ai đó. chúc mừng! Aaron

/** 
* utility to create an arbitrary directory hierarchy on the remote ftp server 
* @param client 
* @param dirTree the directory tree only delimited with/chars. No file name! 
* @throws Exception 
*/ 
private static void ftpCreateDirectoryTree(FTPClient client, String dirTree) throws IOException { 

    boolean dirExists = true; 

    //tokenize the string and attempt to change into each directory level. If you cannot, then start creating. 
    String[] directories = dirTree.split("/"); 
    for (String dir : directories) { 
    if (!dir.isEmpty()) { 
     if (dirExists) { 
     dirExists = client.changeWorkingDirectory(dir); 
     } 
     if (!dirExists) { 
     if (!client.makeDirectory(dir)) { 
      throw new IOException("Unable to create remote directory '" + dir + "'. error='" + client.getReplyString()+"'"); 
     } 
     if (!client.changeWorkingDirectory(dir)) { 
      throw new IOException("Unable to change into newly created remote directory '" + dir + "'. error='" + client.getReplyString()+"'"); 
     } 
     } 
    } 
    }  
} 
+1

Bạn đã tiết kiệm thời gian của tôi .. Cảm ơn Aaron! – Mohsin

+0

Nếu phương pháp không lặp lại cấu trúc phân cấp thì sao? Nếu phương pháp này được gọi nhiều lần, nó phải luôn luôn đi qua cây hoàn chỉnh. – djmj

+0

Cảm ơn bạn, đây chính là lý do tại sao tôi đến SO! Tiết kiệm thời gian tuyệt vời! – Davor

0

Sử dụng chức năng ftpSession.mkdir để tạo thư mục.

@ManagedOperation 
private void ftpMakeDirectory(FtpSession ftpSession, String fullDirFilePath) throws IOException { 
if (!ftpSession.exists(fullDirFilePath)) { 
    String[] allPathDirectories = fullDirFilePath.split("/"); 
    StringBuilder partialDirPath = new StringBuilder(""); 
    for (String eachDir : allPathDirectories) { 
    partialDirPath.append("/").append(eachDir); 

    ftpSession.mkdir(partialDirPath.toString()); 
    } 

}

Các vấn đề liên quan