/**
* 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:OR!一个更好的方法(在某些情况下)是返回目录中的文件流:
/**
* 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;
}
import 'package:path/path.dart' as path;
void copyDirectorySync(Directory source, Directory destination) {
/// create destination folder if not exist
if (!destination.existsSync()) {
destination.createSync(recursive: true);
}
/// get all files from source (recursive: false is important here)
source.listSync(recursive: false).forEach((entity) {
final newPath = destination.path + Platform.pathSeparator + path.basename(entity.path);
if (entity is File) {
entity.copySync(newPath);
} else if (entity is Directory) {
copyDirectorySync(entity, Directory(newPath));
}
});
}
5条答案
按热度按时间daupos2t1#
发现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>
。7lrncoxx2#
不,据我所知没有。但是Dart支持从目录中阅读和写入文件的基本功能,因此可以通过编程解决这个问题。
看看this gist,我发现了一个可以完成这个过程的工具。
基本上,您将搜索目录中想要复制的文件并执行复制操作:
到
new Directory(newLocation);
中的所有文件路径new Path(element.path);
。编辑:
但这是非常低效的,因为整个文件必须由系统读入并写回文件。你可以使用Dart生成的use a shell process来处理这个过程:
sqougxex3#
谢谢你詹姆斯,写了一个快速的功能,但它的替代方式。我不确定这种方式是否更有效?
Edit:OR!一个更好的方法(在某些情况下)是返回目录中的文件流:
jv2fixgn4#
我今天遇到了同样的问题。事实证明,来自www.example.com的io包pub.dev在一个干净的API中解决了这个问题:copyPath或copyPathSync
https://pub.dev/documentation/io/latest/io/copyPath.html
nimxete25#