Dart 中是不是有用于复制目录的内置函数?
Posted
技术标签:
【中文标题】Dart 中是不是有用于复制目录的内置函数?【英文标题】:Is there a built-in function to copy a directory in Dart?Dart 中是否有用于复制目录的内置函数? 【发布时间】:2015-01-28 01:28:41 【问题描述】:Dart 中是否有内置函数可以复制目录并递归复制所有文件(和其他目录)?
【问题讨论】:
【参考方案1】:不,据我所知没有。但是 Dart 支持从目录中读取和写入文件的基本功能,因此可以通过编程方式解决这个问题。
查看this gist,我发现了一个可以完成此过程的工具。
基本上,您会在目录中搜索要复制的文件并执行复制操作:
newFile.writeAsBytesSync(element.readAsBytesSync());
到new Directory(newLocation);
中的所有文件路径new Path(element.path);
。
编辑:
但是这样效率非常低,因为整个文件必须由系统读入并写回一个文件。你可以由 Dart 生成的 use a shell process 来为你处理这个过程:
Process.run("cmd", ["/c", "copy", ...])
【讨论】:
【参考方案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;
【讨论】:
【参考方案3】:找到似乎对我有用的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>
。
【讨论】:
以上是关于Dart 中是不是有用于复制目录的内置函数?的主要内容,如果未能解决你的问题,请参考以下文章