Esiste una funzione integrata per copiare una directory e copiare ricorsivamente tutti i file (e altre directory) in Dart?Esiste una funzione integrata per copiare una directory in Dart?
risposta
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", ...])
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;
}