【问题标题】:List folder content with Vala使用 Vala 列出文件夹内容
【发布时间】:2014-12-30 08:42:38
【问题描述】:

我正在尝试执行一项基本任务:将文件夹的内容列出到字符串数组或List<string> 或可迭代的东西。但这似乎很棘手,我在 API 中找不到我需要的东西。

我当前的代码:

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.htmlhttp://valadoc.org/#!api=glib-2.0/GLib.Log.FILE,一开始看起来很简单。

感谢您的帮助。

更多全球背景:我想尝试一下 Synapse (launchpad.net/synapse-project) 插件。

【问题讨论】:

  • 您自己在答案中发现了这一点,但也许这对其他人有帮助:C/C++ 代码中的 GLib 类以 G 为前缀。在 Vala 中,您必须删除该前缀,例如GDir 变为 GLib.Dir(或者只是 Dir,因为默认情况下始终使用 GLib)。
  • 类似地g_dir_open () 变成Dir.open (),你也不应该在 Vala 中使用指针。 Vala 正在使用具有自动引用计数的引用。此外,您可以使用类型推断,因此您的行会更短,写成var t = Dir.open (...);
  • 千百次感谢这些建议!!! Vala 看起来是一个非常好的开发选择,而名称空间看起来有点令人困惑:D

标签: linux glib vala


【解决方案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;
    }
}

我希望这会对某人有所帮助。

【讨论】:

  • 你确定这段代码能正常工作吗?您正在创建一个 File 对象,但您没有使用它。 directory 字符串变量也不应该包含您的文档集路径吗?
  • 是的,这段代码可以工作(我不是作者,所以..),这只是为了证明概念,当然我使用的是文档集而不是目录字符串
猜你喜欢
  • 1970-01-01
  • 2019-04-21
  • 1970-01-01
  • 2016-01-05
  • 1970-01-01
  • 1970-01-01
  • 2018-07-29
  • 1970-01-01
  • 2010-11-10
相关资源
最近更新 更多