2014-12-30 4 views
1

Я пытаюсь выполнить основную задачу: перечислить содержимое папки в массив строк или List<string> или что-то итеративное. Но это кажется настолько сложным, и я не могу найти то, что мне нужно в API.Список содержимого папки с Vala

Мой текущий код:

using GLib; 
using Gtk; 

class Demo.HelloWorld : GLib.Object { 
    public static int main(string[] args) { 
     File docsets = File.new_for_path (Environment.get_home_dir() + 
       "/.local/share/zeal/docsets"); 
     try { 
      GDir* t = g_dir_open(Environment.get_home_dir()); 
     } catch (FileError e) { 
      stderr.printf ("%s\n", e.message); 
     } 
     stdout.printf(Environment.get_home_dir()+"\n"); 
     stdout.printf("Hello, World\n"); 
     return 0; 
    } 
} 

Я компиляции с: valac main.vala --pkg gtk+-3.0 и я получил следующее сообщение об ошибке:

main.vala:27.6-27.14: error: The type name `GLib.GDir' could not be found 
       GLib.GDir* t = g_dir_open(Environment.get_home_dir()); 

Я попытался, глядя на https://developer.gnome.org/glib/2.42/glib-File-Utilities.html и http://valadoc.org/#!api=glib-2.0/GLib.Log.FILE, это выглядело довольно просто на начало.

Благодарим за помощь.

Для более глобального контекста: я хочу попробовать подключиться к плагину Synapse (launchpad.net/synapse-project).

+1

Вы нашли это в своем ответе, но, возможно, это полезно для кого-то другого: классы GLib в коде C/C++ имеют префикс 'G'. В Вале вам нужно отбросить этот префикс, например. 'GDir' становится' GLib.Dir' (или просто 'Dir', поскольку GLib ist всегда используется по умолчанию). –

+1

Аналогично 'g_dir_open()' становится 'Dir.open()', также вы не должны использовать указатели в Vala. Вместо этого Vala использует ссылки с автоматическим подсчетом ссылок. Кроме того, вы можете использовать вывод типа, чтобы ваша строка была короче написана как «var t = Dir.open (...);' –

+0

Спасибо за тысячи раз за эти советы !!! Вала выглядит действительно хорошим выбором, в то время как пространства имен выглядят несколько запутанными: D – Kwaadpepper

ответ

1

я наконец нашел несколько примеров по адресу: http://www.valadoc.org/#!api=glib-2.0/GLib.Dir

У меня есть следующий код:

class Demo.HelloWorld : GLib.Object { 
    public static int main(string[] args) { 
     File docsets = File.new_for_path (Environment.get_home_dir() + 
       "/.local/share/zeal/docsets"); 
     try { 
      string directory = "./"; 
      Dir dir = Dir.open (directory, 0); 
      string? name = null; 
      while ((name = dir.read_name()) != null) { 
       string path = Path.build_filename (directory, name); 
       string type = ""; 

       if (FileUtils.test (path, FileTest.IS_REGULAR)) { 
        type += "| REGULAR "; 
       } 
       if (FileUtils.test (path, FileTest.IS_SYMLINK)) { 
        type += "| SYMLINK "; 
       } 
       if (FileUtils.test (path, FileTest.IS_DIR)) { 
        type += "| DIR "; 
       } 
       if (FileUtils.test (path, FileTest.IS_EXECUTABLE)) { 
        type += "| EXECUTABLE "; 
       } 
       stdout.printf ("%s\t%s\n", name, type); 
      } 
     } catch (FileError err) { 
      stderr.printf (err.message); 
     } 
     return 0; 
    } 
} 

Я надеюсь, это поможет кому-то.

+0

Вы уверены, что этот код работает правильно? Вы создаете объект 'File', но вы его не используете. Также не должна содержать строковую переменную 'directory' вместо вашего пути docsets? –

+0

Да, этот код работает (я не автор, поэтому ..), и это просто для доказательства концепции, конечно, я использую docsets вместо строки каталога – Kwaadpepper

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