我在我的应用程序中使用油腔滑调,我看到有在油嘴滑舌更便利的包装对于C的remove,unlink和rmdir.但这些只能一次在单个文件或目录上工作.
据我所知,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)
显然,一旦遇到致命错误,我会构建一些错误处理等来中止进程.
我正在使用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) 我应该使用什么功能使用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) GObject库真的很有文件记录.很难确定创建实体的目的.也就是说,我不明白的角色GValue,GTypeValueTable,GTypeInfo,GParamSpec和TypeData.
简而言之,类型注册的过程如下.每种类型由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并且GObject是GTypes自己,所以它们被注册为类型.
GValue 用于通过它注册新类型值,但如何?
GParameters并且GParamSpec似乎需要注册GObject类型(不确定).究竟是怎么做到的?每个人的角色是什么?
最重要的:是什么的角色GTypeValueTable,GTypeInfo和TypeData?TypeData被引用TypeNode并包含GTypeValueTable子结构BoxedData,ClassData,IFaceData,InstanceData(为什么Instance,我们不是注册类型?).而且,它们似乎互相复制,导致它们全部包含对base_init/finalize的引用,class_init/finalize具有引用GTypeValueTable.
所以,GObject papas,如果你正在读这篇文章,请自己解释一下!描述您使用的那些结构的目的.
我只是试图运行一个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方法,所以我很困惑.
我一直在阅读一些使用的代码,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
我正在用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,但没有任何改变.我在网上搜索了帮助,但找不到解决方案.我是一个菜鸟,我不知道如何解决这个问题.
谁能帮我吗?我非常感谢你的时间!
嗨,每个人都告诉我如何安装glib和gtk我正在使用ubuntu 10.04.我做了;没有找到任何命令,请告诉我安装它的程序
我有一个用C语言编写的库和glib/gobject.它通过g_debug()调用产生大量的调试信息.此信息对于故障排除非常有用,但是当实际应用程序包含库时,我不希望它显示.所以,基本上我需要一种方法来控制/过滤调试信息量,我无法弄清楚它应该如何与glib一起使用.有人能指出我正确的方向吗?
我有一个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)
会因为出界而失败.