标签: glib

如何在C中遍历目录

我在我的应用程序中使用油腔滑调,我看到有在油嘴滑舌更便利的包装对于C的remove,unlinkrmdir.但这些只能一次在单个文件或目录上工作.

据我所知,C标准和glib都不包含任何类型的递归目录遍历功能.我也没有看到任何特定方法一次删除整个目录树,如同rm -rf.

对于我正在做的事情,我并不担心任何复杂的问题,例如权限,符号链接备份树(无限递归),或任何会排除一个非常天真的实现...所以我不反对编写自己的它的功能.

但是,我很好奇这个功能是否已经存在于标准库gtk或glib(或其他一些容易重用的C库)的某个地方,我只是没有偶然发现它.谷歌搜索这个主题会产生很多错误的线索.

否则我的计划是使用这种算法:

dir_walk(char* path, void* callback(char*) {
  if(is_dir(path) && has_entries(path)) {
    entries = get_entries(path);
    for(entry in intries) { dir_walk(entry, callback); }
  }
  else { callback(path) }
}

dir_walk("/home/user/trash", remove);
Run Code Online (Sandbox Code Playgroud)

显然,一旦遇到致命错误,我会构建一些错误处理等来中止进程.

c gtk glib directory-walk

7
推荐指数
3
解决办法
4437
查看次数

如何在Makefile中配置glib?

我正在使用Eclipse CDT开发C软件.我想使用glib,但它总是报告"Unresolved inclusion:".我在我的ubuntu上安装了glib:

carl@Carl:~$ dpkg -l | grep libglib
ii  libglib-perl                          2:1.223-1        
ii  libglib2.0-0                          2.28.6-0ubuntu1      
ii  libglib2.0-bin                        2.28.6-0ubuntu1      
ii  libglib2.0-cil                        2.12.10-1ubuntu1       
ii  libglib2.0-data                       2.28.6-0ubuntu1        
ii  libglib2.0-dev                        2.28.6-0ubuntu1       
ii  libglib2.0-doc                        2.28.6-0ubuntu1       
ii  libglibmm-2.4-1c2a                    2.28.0-1                 
Run Code Online (Sandbox Code Playgroud)

我是C的新生.虽然我找到了一些建议:

% gcc test.c -Wall -o test `pkg-config --cflags --libs glib-2.0`
Run Code Online (Sandbox Code Playgroud)

但我不知道如何通过我的Makefile使它工作:

CC=         gcc
CXX=        g++
CFLAGS=     -ggdb -g -Wall -O2
CXXFLAGS=   $(CFLAGS)
DFLAGS=     -DHAVE_PTHREAD #-D_FILE_OFFSET_BITS=64
OBJS=       rand.o
PROG=       peta
INCLUDES=   
LIBS=       -lm -lz -lpthread -Lbwt_gen -lbwtgen
SUBDIRS=    . bwt_gen

.SUFFIXES:.c .o .cc

.c.o:
        $(CC) -c $(CFLAGS) …
Run Code Online (Sandbox Code Playgroud)

makefile glib

7
推荐指数
1
解决办法
9309
查看次数

使用C中的GLib/GIO从Web获取文件

我应该使用什么功能使用GLib/GIO库从Web获取文件?

如果我的文件来自:

gchar *path = "http://xxx.yyyServer/sharing/temp.txt"
Run Code Online (Sandbox Code Playgroud)

我该怎么做才能下载它?

对于本地文件,我只使用像fopen和fread这样的C库.

我该怎么办?

遗憾的是,教程中没有文件处理的例子.我只能从文件对话框中看到文件选择器.


使用注释中的工作代码更新:以下代码适用于未知大小的二进制文件.

char *name= http://127.0.0.1:8000/mybinfile


int getFile(char *name)
{

    GFile *f = g_file_new_for_uri(name);
    GFileInputStream *fis = NULL;
    GDataInputStream* dis = NULL;
    GError *err = NULL;
    //char buffer[2048];
    char *buffer;
    size_t length;
    int ret = -1;

    GFileInfo *info;

    int total_size = -1;

    /* get input stream */
    fis = g_file_read(f, NULL, &err);

    if (err != NULL) {
        fprintf(stderr, "ERROR: opening %s\n", name);
        g_object_unref(f);
        return -1;
    }

    info = g_file_input_stream_query_info (G_FILE_INPUT_STREAM (fis),G_FILE_ATTRIBUTE_STANDARD_SIZE,NULL, &err); …
Run Code Online (Sandbox Code Playgroud)

c url glib

7
推荐指数
1
解决办法
2310
查看次数

GValue,GTypeValueTable,GTypeInfo和GParamSpec的目的

GObject库真的很有文件记录.很难确定创建实体的目的.也就是说,我不明白的角色GValue,GTypeValueTable,GTypeInfo,GParamSpecTypeData.

简而言之,类型注册的过程如下.每种类型由TypeNode结构表示.有两种TypeNode结构static_fundamental_type_nodes array存储:用于存储TypeNodes静态基本类型和static_type_nodes_ht用于静态非基本类型的哈希表.在基本类型的情况下,每个GType只是TypeNode非基本类型或TypeNodein的索引的对应的存储器地址static_fundamental_type_nodes.动态类型会发生什么 - 我不知道,如果可以,请解释我.相应的代码驻留在gtype_init函数中,负责类型系统的初始化:http://git.gnome.org/browse/glib/tree/gobject/gtype.c#n4323 .

在此输入图像描述

GValue,GParamSpec并且GObjectGTypes自己,所以它们被注册为类型.

GValue 用于通过它注册新类型值,但如何?

GParameters并且GParamSpec似乎需要注册GObject类型(不确定).究竟是怎么做到的?每个人的角色是什么?

最重要的:是什么的角色GTypeValueTable,GTypeInfoTypeDataTypeData被引用TypeNode并包含GTypeValueTable子结构BoxedData,ClassData,IFaceData,InstanceData(为什么Instance,我们不是注册类型?).而且,它们似乎互相复制,导致它们全部包含对base_init/finalize的引用,class_init/finalize具有引用GTypeValueTable.

所以,GObject papas,如果你正在读这篇文章,请自己解释一下!描述您使用的那些结构的目的.

gtk gnome gobject glib

7
推荐指数
1
解决办法
2114
查看次数

更新了Bluez DBUS-API文档?

我只是试图运行一个vala bluez示例(在DbusClientSamples页面中找到)并且我收到此错误:

GDBus.Error:org.freedesktop.DBus.Error.UnknownObject:
Method "DiscoverDevices" with signature "" on interface "org.bluez.Adapter"
doesn't exist
Run Code Online (Sandbox Code Playgroud)

该示例是否使用了弃用的API?如果是,我在哪里可以找到有关bluez的DBUS API的更新文档?我找到的所有文件(通过谷歌搜索)都包含该DiscoverDevices方法,所以我很困惑.

dbus bluetooth glib vala gio

7
推荐指数
2
解决办法
1万
查看次数

为什么有人会使用gboolean(GLib)而不是bool类型?

我一直在阅读一些使用的代码,gtk+我遇到了类似gboolean和的类型gunichar.

只要我能理解使用gunichar而不是wchar_t(glib gunichar和wchar_t),我就无法真正理解使用gboolean而不是使用bool.

问题:用什么gboolean代替bool?有没有什么比仅仅注意代码风格的一致性?

如果它被用于一般的一致性(如果一个人决定使用GLib,人们更愿意使用那里定义的类型),那对我来说就不会那么奇怪了.但是,该代码的作者使用int而不是gint.作者是不是很粗心?


只是添加更多细节(官方GLib作为参考):

  • gunichar 被定义为 typedef guint32 gunichar

  • guint32 被定义为 typedef unsigned int guint32

  • gboolean 被定义为 typedef gint gboolean

  • gint 被定义为 typedef int gint

c glib

7
推荐指数
2
解决办法
2941
查看次数

我该如何解决这个错误?Gtk-WARNING**:GModule ...初始化检查失败:GLib版本太旧(微不匹配)

我正在用matplotlib编写一个python程序,我收到了这个错误:

GLib-GIO-Message:使用'内存'GSettings后端.您的设置不会保存或与其他应用程序共享.

(python:6304):Gtk-WARNING**:GModule(/usr/lib/x86_64-linux-gnu/gtk-2.0/2.10.0/immodules/im-ibus.so)初始化检查失败:GLIB>版本太旧(微不匹配)

(python:6304):Gtk-WARNING**:加载IM上下文类型'ibus'失败

(python:6304):Gtk-WARNING**:GModule(/usr/lib/x86_64-linux-gnu/gtk-2.0/2.10.0/immodules/im-ibus.so)初始化检查失败:GLib版本太旧(微不匹配)

(python:6304):Gtk-WARNING**:加载IM上下文类型'ibus'失败

(python:6304):Gtk-WARNING**:GModule(/usr/lib/x86_64-linux-gnu/gtk-2.0/2.10.0/immodules/im-ibus.so)初始化检查失败:GLib版本太旧(微不匹配)

(python:6304):Gtk-WARNING**:加载IM上下文类型'ibus'失败

程序完成执行,但错误不会消失.我正在运行Ubuntu 16.

我尝试重新安装Glib,但没有任何改变.我在网上搜索了帮助,但找不到解决方案.我是一个菜鸟,我不知道如何解决这个问题.

谁能帮我吗?我非常感谢你的时间!

python linux gtk glib matplotlib

7
推荐指数
1
解决办法
4200
查看次数

安装gtk和glib

嗨,每个人都告诉我如何安装glib和gtk我正在使用ubuntu 10.04.我做了;没有找到任何命令,请告诉我安装它的程序

linux gtk glib

6
推荐指数
2
解决办法
5万
查看次数

如何控制glib中的调试信息级别?

我有一个用C语言编写的库和glib/gobject.它通过g_debug()调用产生大量的调试信息.此信息对于故障排除非常有用,但是当实际应用程序包含库时,我不希望它显示.所以,基本上我需要一种方法来控制/过滤调试信息量,我无法弄清楚它应该如何与glib一起使用.有人能指出我正确的方向吗?

c glib

6
推荐指数
1
解决办法
1万
查看次数

如何找到给定GArray的长度?

我有一个Grray的GValue(全部为非零),它已在运行时使用g_array_append_val分配.我想知道如何才能找出最后一个元素的索引是什么,或者更确切地说是数组所包​​含的元素数量.代码就像


for (length=0;g_value_get_int(&g_array_index(array, GValue, length)); length++);
return length
Run Code Online (Sandbox Code Playgroud)

会因为出界而失败.

c glib

6
推荐指数
1
解决办法
1001
查看次数

标签 统计

glib ×10

c ×5

gtk ×4

linux ×2

bluetooth ×1

dbus ×1

directory-walk ×1

gio ×1

gnome ×1

gobject ×1

makefile ×1

matplotlib ×1

python ×1

url ×1

vala ×1