是否有内置函数来复制Dart中的目录?

时间:2014-11-29 17:05:11

标签: directory copy dart

是否有内置函数来复制目录并以递归方式复制Dart中的所有文件(和其他目录)?

3 个答案:

答案 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>