2017-05-29 88 views
0

我正在創建應用程序以將文件從一個目錄複製到另一個目錄。如何通過java服務將文件從一個目錄複製到azure中的其他目錄?

JSON輸入是:

{ "accountName" : "name", 
    "accountKey" : "key", 
    "source" : "directory1/directory2/directory3/directory4", 
    "destination" : "directory1/directory2", 
    "fileToCopy" : "1" 
} 

指南4是下目錄3,圖3是根據圖2和圖2是根據1.

想從目錄4拷貝命名爲 「1」,文件目錄2.

我的Java代碼:

@Override 
    public JSONObject copyFile(JSONObject jsonInput) throws IOException, InvalidKeyException, URISyntaxException { 
     CloudFileClient fileClient = null; 
     String storageConnectionString = "DefaultEndpointsProtocol=https;AccountName="+jsonInput.get("accountName")+";"+"AccountKey="+jsonInput.get("accountKey"); 
     System.out.println(storageConnectionString); 
     CloudStorageAccount storageAccount = CloudStorageAccount.parse(storageConnectionString); 
     JSONObject jsonOutput = new JSONObject(); 
     try { 
      fileClient = storageAccount.createCloudFileClient(); 

      String source = jsonInput.get("source").toString(); 
      String destination = jsonInput.get("destination").toString(); 
      String fileToCopy = jsonInput.get("fileToCopy").toString(); 
      String[] sourceNameArray = source.split("\\s*/\\s*"); 
      System.out.println(sourceNameArray.length); 
      String[] destinationNameArray = destination.split("\\s*/\\s*"); 
      System.out.println(destinationNameArray.length); 
      CloudFileShare share = fileClient 
        .getShareReference(sourceNameArray[0].toLowerCase().replaceAll("[-+.^:,[email protected]#$%&*()_~`]", "")); 
      CloudFileDirectory rootDir = share.getRootDirectoryReference(); 
      for (int i=0; i< sourceNameArray.length; i++) 
      { 
       String directoryToCreate = sourceNameArray[i]; 
       CloudFileDirectory directory = rootDir.getDirectoryReference(directoryToCreate); 
       if(i==sourceNameArray.length-1) 
       { 
        CloudFile fileToCopyFromSorce = directory.getFileReference(fileToCopy); 

        for (int j=0; j< destinationNameArray.length; j++) 
        { 
         String directoryToCreateForDestination = destinationNameArray[j]; 
         CloudFileDirectory directoryForDestination = rootDir.getDirectoryReference(directoryToCreateForDestination); 
         if(j==destinationNameArray.length-1){ 
         CloudFile fileDestination = directoryForDestination.getFileReference(fileToCopy); 
         // is next line required? 
       //fileToCopyFromSorce.create(1); 
         fileDestination.startCopy(fileToCopyFromSorce); 
         System.out.println("copied to destination"); 
         jsonOutput.put("status", "successful"); 
         } 
         rootDir = directoryForDestination; 
        } 
       } 
       rootDir = directory; 
      } 

     } catch (Exception e) { 
      System.out.println("Exception is " + e); 
      jsonOutput.put("status", "unsuccessful"); 
      jsonOutput.put("exception", e.toString()); 
     } 
     return jsonOutput; 
    } 

我得到錯誤的,

Exception is com.microsoft.azure.storage.StorageException: The specified parent path does not exist. 

但我在我的azure存儲帳戶中指定了父路徑。

如果可能的話,需要關於代碼和任何參考代碼的建議。

回答

3

根據例外情況,問題是由Azure文件存儲上不存在的文件的父目錄引起的,如下圖從here所示。

enter image description here

所以,你需要一個從根首先檢查並創建這些父目錄一個給孩子,如下面的代碼爲目標路徑,當你需要取得相應目錄參考。

String destination = "directory1/directory2"; 
CloudFileDirectory rootDir = share.getRootDirectoryReference(); 
String[] destinationNameArray = destination.split("/"); 
CloudFileDirectory kidDir = rootDir; 
for(String name: destinationNameArray) { 
    kidDir = kidDir.getDirectoryReference(name); 
    kidDir.createIfNotExists(); 
} 

然後你可以直接從源文件複製文件到目標如下。

String source = "directory1/directory2/directory3/directory4"; 
String destination = "directory1/directory2"; 
String fileName = "1"; 
CloudFileDirectory sourceDir = rootDir.getDirectoryReference(source); 
CloudFileDirectory destinationDir = rootDir.getDirectoryReference(destination); 
CloudFile sourceFile = sourceDir.getFileReference(fileName); 
CloudFile destinationFile = destinationDir.getFileReference(fileName); 
destinationFile.startCopy(sourceFile); 
+0

謝謝。有效。但是,你能告訴我爲什麼我們需要編寫代碼來創建目錄,即使我們知道這些目錄已經存在了嗎? –

+0

@AuuragBonde只需檢查,並創建如果不存在。這就是'createIfNotExists'的意思。 –

+0

雅,明白你的意思。再次感謝。 –

相關問題