2013-05-09 4 views
2

Я новичок в Вала, так что это может быть глупый вопрос.Как я могу рекурсивно копировать каталог с помощью vala?

В соответствии с #vala на gimpnet рекурсивно не копируются каталоги, используя Glib.File.copy. В настоящий момент я использую:

Posix.system("cp -r absolutesource absolutedestination") 

Есть ли лучший способ сделать это?

ответ

3

Как я уже говорил в 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; 
} 

Кроме того, стоит отметить, что вы можете использовать одну из функций в GLib.Process вместо Posix.system.

Смежные вопросы