2014-11-29 9 views

risposta

3

No, non a mia conoscenza non c'è. Ma Dart supporta la lettura di base e la scrittura di file da directory, quindi è ovvio che questo potrebbe essere risolto a livello di programmazione.

Check out this gist Ho trovato uno strumento che avrebbe portato a termine questo processo.

In sostanza, si dovrebbe cercare la directory per i file che si voleva copiare ed eseguire l'operazione di copia:

newFile.writeAsBytesSync(element.readAsBytesSync()); 

a tutti i percorsi di file, new Path(element.path);, nel new Directory(newLocation);.

Edit:

Ma questo è super inefficiente, perché i file intere deve essere letto in dal sistema e ha scritto di nuovo fuori in un file. Si potrebbe semplicemente use a shell process generato da DART a prendersi cura del processo per voi:

Process.run("cmd", ["/c", "copy", ...]) 
2

Grazie James, ha scritto una funzione rapida per questo, ma ha fatto un modo alternativo. Non sono sicuro se in questo modo sarebbe più efficiente o no?

/** 
* Retrieve all files within a directory 
*/ 
Future<List<File>> allDirectoryFiles(String directory) 
{ 
    List<File> frameworkFilePaths = []; 

    // Grab all paths in directory 
    return new Directory(directory).list(recursive: true, followLinks: false) 
    .listen((FileSystemEntity entity) 
    { 
    // For each path, if the path leads to a file, then add to array list 
    File file = new File(entity.path); 
    file.exists().then((exists) 
    { 
     if (exists) 
     { 
     frameworkFilePaths.add(file); 
     } 
    }); 

    }).asFuture().then((_) { return frameworkFilePaths; }); 

} 

Edit: O! Un approccio ancora migliore (in alcune situazioni) sarebbe quello di restituire un flusso di file nella directory:

/** 
* Directory file stream 
* 
* Retrieve all files within a directory as a file stream. 
*/ 
Stream<File> _directoryFileStream(Directory directory) 
{ 
    StreamController<File> controller; 
    StreamSubscription source; 

    controller = new StreamController<File>(
    onListen:() 
    { 
     // Grab all paths in directory 
     source = directory.list(recursive: true, followLinks: false).listen((FileSystemEntity entity) 
     { 
     // For each path, if the path leads to a file, then add the file to the stream 
     File file = new File(entity.path); 
     file.exists().then((bool exists) 
     { 
      if (exists) 
      controller.add(file); 
     }); 
     }, 
     onError:() => controller.addError, 
     onDone:() => controller.close 
    ); 
    }, 
    onPause:() { if (source != null) source.pause(); }, 
    onResume:() { if (source != null) source.resume(); }, 
    onCancel:() { if (source != null) source.cancel(); } 
); 

    return controller.stream; 
}