如何使用 vala 递归复制目录?

bea*_*roo 3 file-io vala

我是 Vala 的新手,所以这可能是一个愚蠢的问题。

根据 gimpnet 上的 #vala,不可能使用Glib.File.copy递归复制目录。目前我正在使用:

Posix.system("cp -r absolutesource absolutedestination")
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来做到这一点?

nem*_*equ 5

正如我在 IRC 中告诉你的,你可以编写一个函数来通过调用GLib.File.copy你想要复制的每个文件来自己完成。这是一个基本示例:

public bool copy_recursive (GLib.File src, GLib.File dest, GLib.FileCopyFlags flags = GLib.FileCopyFlags.NONE, GLib.Cancellable? cancellable = null) throws GLib.Error {
  GLib.FileType src_type = src.query_file_type (GLib.FileQueryInfoFlags.NONE, cancellable);
  if ( src_type == GLib.FileType.DIRECTORY ) {
    dest.make_directory (cancellable);
    src.copy_attributes (dest, flags, cancellable);

    string src_path = src.get_path ();
    string dest_path = dest.get_path ();
    GLib.FileEnumerator enumerator = src.enumerate_children (GLib.FileAttribute.STANDARD_NAME, GLib.FileQueryInfoFlags.NONE, cancellable);
    for ( GLib.FileInfo? info = enumerator.next_file (cancellable) ; info != null ; info = enumerator.next_file (cancellable) ) {
      copy_recursive (
        GLib.File.new_for_path (GLib.Path.build_filename (src_path, info.get_name ())),
        GLib.File.new_for_path (GLib.Path.build_filename (dest_path, info.get_name ())),
        flags,
        cancellable);
    }
  } else if ( src_type == GLib.FileType.REGULAR ) {
    src.copy (dest, flags, cancellable);
  }

  return true;
}
Run Code Online (Sandbox Code Playgroud)

此外,值得注意的是,您可能希望使用GLib.Process中的函数之一而不是 Posix.system。