2017-05-29 1 views
0

Ich erstelle eine Anwendung zum Kopieren von Dateien von einem Verzeichnis in ein anderes.Wie kopiere ich die Datei von einem Verzeichnis zu einem anderen in Azure durch Java-Service?

JSon Eingang:

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

Verzeichnis 4 unter Verzeichnis 3, 3 unter 2 und 2 ist unter 1.

Wollen Datei mit dem Namen "1" aus dem Verzeichnis 4 in das Verzeichnis kopieren 2.

Mein Java-Code ist:

@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; 
    } 

ich Störung erhalte wie

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

Aber ich habe übergeordnete Pfad in meinem azurblauen Speicherkonto angegeben.

Brauchen Sie einen Vorschlag für Code und Referenzcode, wenn möglich.

Antwort

3

Laut der Ausnahme wurde das Problem von den übergeordneten Verzeichnissen einer Datei verursacht, die nicht in Azure File Storage vorhanden ist, wie die folgende Abbildung aus here.

enter image description here

So müssen Sie diese übergeordneten Verzeichnisse nacheinander von der Wurzel, um die Kinder zu überprüfen und erstellen zunächst wie dem folgenden Code für Zielpfad, wenn Sie das Verzeichnis Verweis erhalten müssen.

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(); 
} 

Dann können Sie eine Datei direkt von Quelle zu Ziel wie folgt kopieren.

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

Vielen Dank. Es funktionierte. Aber können Sie mir bitte sagen, warum wir Code schreiben müssen, um ein Verzeichnis zu erstellen, selbst wenn wir wissen, dass diese bereits existieren? –

+0

@AnuragBonde Nur überprüfen, und erstellen, wenn nicht existiert. Das ist die Methode 'createIfNotExists'. –

+0

Ja, hab deinen Punkt. Danke nochmal. –

Verwandte Themen