从 std::FILE* 创建 GIO GFile 或 GInputStream
Creating a GIO GFile or GInputStream from std::FILE*
我必须连接两个 API,它们使用不同的结构来描述文件。其中一个为我提供了 std::FILE* and the second one expects a GFile* or GInputStream* belonging to the GIO。有没有一种直接的方法可以从我收到的原始文件指针创建任一对象?
void my_function(std::FILE * file) {
GFile * gfile = some_creator_method(file);
//or alternatively
GInputStream * ginput = some_stream_creator_method(file);
//...
//pass the GFile to the other library interface
//either using:
interface_function(gfile);
//or using
interface_stream_function(ginput);
}
//The interface function signatures I want to pass the parameter to:
void interface_function(GFile * f);
void interface_stream_function(GInputStream * is);
如果你想re-use底层文件句柄,你需要去platform-specific。
在 POSIX 上:fileno
in combination with g_unix_input_stream_new
在 Windows 上:_get_osfhandle
in combination with g_win32_input_stream_new
例如像这样:
void my_method(FILE* file) {
#ifdef _WIN32
GInputStream* ginput = g_win32_input_stream_new(_get_osfhandle(file), false);
#else
GInputStream* ginput = g_unix_input_stream_new(fileno(file), false);
#endif
. . .
. . .
g_input_stream_close(ginput, nullptr, nullptr);
}
请记住,只要 ginput
在使用中,file
就应该保持打开状态。
我必须连接两个 API,它们使用不同的结构来描述文件。其中一个为我提供了 std::FILE* and the second one expects a GFile* or GInputStream* belonging to the GIO。有没有一种直接的方法可以从我收到的原始文件指针创建任一对象?
void my_function(std::FILE * file) {
GFile * gfile = some_creator_method(file);
//or alternatively
GInputStream * ginput = some_stream_creator_method(file);
//...
//pass the GFile to the other library interface
//either using:
interface_function(gfile);
//or using
interface_stream_function(ginput);
}
//The interface function signatures I want to pass the parameter to:
void interface_function(GFile * f);
void interface_stream_function(GInputStream * is);
如果你想re-use底层文件句柄,你需要去platform-specific。
在 POSIX 上:
fileno
in combination withg_unix_input_stream_new
在 Windows 上:
_get_osfhandle
in combination withg_win32_input_stream_new
例如像这样:
void my_method(FILE* file) {
#ifdef _WIN32
GInputStream* ginput = g_win32_input_stream_new(_get_osfhandle(file), false);
#else
GInputStream* ginput = g_unix_input_stream_new(fileno(file), false);
#endif
. . .
. . .
g_input_stream_close(ginput, nullptr, nullptr);
}
请记住,只要 ginput
在使用中,file
就应该保持打开状态。