Dart中是否有内置的复制目录的功能?

llycmphe  于 2023-05-04  发布在  其他
关注(0)|答案(5)|浏览(159)

是否有一个内置的功能来复制目录和递归复制Dart中的所有文件(和其他目录)?

daupos2t

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>

7lrncoxx

7lrncoxx2#

不,据我所知没有。但是Dart支持从目录中阅读和写入文件的基本功能,因此可以通过编程解决这个问题。
看看this gist,我发现了一个可以完成这个过程的工具。
基本上,您将搜索目录中想要复制的文件并执行复制操作:

newFile.writeAsBytesSync(element.readAsBytesSync());

new Directory(newLocation);中的所有文件路径new Path(element.path);

编辑:

但这是非常低效的,因为整个文件必须由系统读入并写回文件。你可以使用Dart生成的use a shell process来处理这个过程:

Process.run("cmd", ["/c", "copy", ...])
sqougxex

sqougxex3#

谢谢你詹姆斯,写了一个快速的功能,但它的替代方式。我不确定这种方式是否更有效?

/**
 * 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;
}
jv2fixgn

jv2fixgn4#

我今天遇到了同样的问题。事实证明,来自www.example.com的io包pub.dev在一个干净的API中解决了这个问题:copyPath或copyPathSync
https://pub.dev/documentation/io/latest/io/copyPath.html

nimxete2

nimxete25#

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));
    }
  });
}

相关问题