是否有内置函数来复制目录并以递归方式复制Dart中的所有文件(和其他目录)?
答案 0 :(得分:4)
不,据我所知,不存在。但Dart支持从目录中基本读取和写入文件,因此可以通过编程方式解决这个问题。
查看this gist我找到了一个可以完成此过程的工具。
基本上,您可以在目录中搜索要复制的文件并执行复制操作:
newFile.writeAsBytesSync(element.readAsBytesSync());
到new Path(element.path);
。
new Directory(newLocation);
修改强>
但这是超级低效的,因为整个文件必须由系统读入并写回文件。您可以由Dart生成use a shell process来为您处理这个过程:
Process.run("cmd", ["/c", "copy", ...])
答案 1 :(得分:2)
谢谢詹姆斯,为它编写了一个快速功能,但它是另一种方式。我不确定这种方式是否会更有效率?
/**
* 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; });
}
编辑:或!更好的方法(在某些情况下)是返回目录中的文件流:
/**
* 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;
}
答案 2 :(得分:1)
找到了https://pub.dev/documentation/io/latest/io/copyPath.html(或同步版本),似乎对我有用。它是io软件包https://pub.dev/documentation/io/latest/io/io-library.html的一部分,可从https://pub.dev/packages/io获得。
它等效于cp -R <from> <to>
。