如何使用 GtkFileChooserButton 从选定的文件夹中获取文件?
How to get files from selected folder with GtkFileChooserButton?
我正在使用 GJS 制作一个 GTK+3 应用程序,其中用户 select 来自 GtkFileChooserButton 的文件夹(action
属性 设置为 select-folder
)。我想在用户 select 编辑的给定文件夹中找到所有图像文件,这样我就可以显示其中一张图像。
我尝试了this._fileChooserButton.get_files()
和this._folderChooseButton.get_uris()
,但它们只有return一个文件,即selected文件夹的路径。像这样:
_init(application) {
this._folderChooseButton.connect('file-set', () => {
this._onFolderChosen();
});
}
_onFolderChosen() {
let folder = this._folderChooseButton.get_file();
// somehow get files from the folder here
this._image.set_from_file(files[1]);
}
从 API 我不太清楚,我如何找出用户的 selected 目录(和子目录)中有哪些图像文件?
好的,在 guadec 的 patrick、georges 和 matthias 的帮助下,这就是我得到的。
get_file()
函数我试过returns一个GFile,在本例中是一个文件夹(在UNIX中,文件夹也是文件)。为了获取目录路径中的文件,我们需要在我们的 GFile 上调用 enumerate_children_async()
,由 get_file()
函数返回。
enumate_children_async()
函数有五个参数:
逗号分隔的属性列表。在我们的例子中,因为我们想要目录中子项的标识符,所以我们想要使用名为 standard::name
.
的属性
FileQueryInfoFlag
:这允许跟随或不跟随符号链接。在这种情况下,我们将使用 FileQueryInfoFlag.NONE
,它不会跟随符号链接。
io_priority
:IO操作应该有多高的优先级(我们将使用GLib.PRIORITY_DEFAULT
)
cancellable
:一个cancelable,就是取消这个操作的一种方式,在这种情况下我们将其保留为null。
callback
:这是您想要运行响应已检索文件的function/code。
有关此功能的更多信息位于 GJS-Docs at GNOME.org
enumerate_children_async()
函数 returns a GFileEnumerator
,我们可以通过调用 next_files_async()
来检索一些文件,它采用以下参数:
num_files
:您要检索多少个文件。在您的情况下,我们使用 1.
io_priority
和cancellable
(同上)。
callback
:我们可以在哪里 运行 一个函数或代码来实际检索文件。
下面是执行此操作的最终代码。
const { Gio, GLib, GObject, Gtk } = imports.gi; // import Gio and GLib API at top of your document.
_onFolderChosen() {
let folder = this._folderChooseButton.get_file();
let files = folder.enumerate_children_async(
'standard::name',
Gio.FileQueryInfoFlags.NONE,
GLib.PRIORITY_DEFAULT,
null,
(source, result, data) => {
this._fileEnumerator = null;
try {
this._fileEnumerator = folder.enumerate_children_finish(result);
} catch (e) {
log('(Error) Could not retreive list of files! Error:' + e);
return;
}
this._readNextFile();
});
}
_readNextFile() {
if (!this._fileEnumerator)
return;
let fileInfo = null;
this._fileEnumerator.next_files_async(
1,
GLib.PRIORITY_DEFAULT,
null,
(source, result, data) => {
try {
fileInfo = this._fileEnumerator.next_files_finish(result);
} catch (e) {
log('Could not retreive the next file! Error:' + e);
return;
}
let file = fileInfo[0].get_name();
let filePath = GLib.build_filenamev([this._folderChooseButton.get_filename(), file]);
this._carousselImage.set_from_file(filePath);
});
}
我正在使用 GJS 制作一个 GTK+3 应用程序,其中用户 select 来自 GtkFileChooserButton 的文件夹(action
属性 设置为 select-folder
)。我想在用户 select 编辑的给定文件夹中找到所有图像文件,这样我就可以显示其中一张图像。
我尝试了this._fileChooserButton.get_files()
和this._folderChooseButton.get_uris()
,但它们只有return一个文件,即selected文件夹的路径。像这样:
_init(application) {
this._folderChooseButton.connect('file-set', () => {
this._onFolderChosen();
});
}
_onFolderChosen() {
let folder = this._folderChooseButton.get_file();
// somehow get files from the folder here
this._image.set_from_file(files[1]);
}
从 API 我不太清楚,我如何找出用户的 selected 目录(和子目录)中有哪些图像文件?
好的,在 guadec 的 patrick、georges 和 matthias 的帮助下,这就是我得到的。
get_file()
函数我试过returns一个GFile,在本例中是一个文件夹(在UNIX中,文件夹也是文件)。为了获取目录路径中的文件,我们需要在我们的 GFile 上调用 enumerate_children_async()
,由 get_file()
函数返回。
enumate_children_async()
函数有五个参数:
逗号分隔的属性列表。在我们的例子中,因为我们想要目录中子项的标识符,所以我们想要使用名为
standard::name
. 的属性
FileQueryInfoFlag
:这允许跟随或不跟随符号链接。在这种情况下,我们将使用FileQueryInfoFlag.NONE
,它不会跟随符号链接。io_priority
:IO操作应该有多高的优先级(我们将使用GLib.PRIORITY_DEFAULT
)cancellable
:一个cancelable,就是取消这个操作的一种方式,在这种情况下我们将其保留为null。callback
:这是您想要运行响应已检索文件的function/code。
有关此功能的更多信息位于 GJS-Docs at GNOME.org
enumerate_children_async()
函数 returns a GFileEnumerator
,我们可以通过调用 next_files_async()
来检索一些文件,它采用以下参数:
num_files
:您要检索多少个文件。在您的情况下,我们使用 1.io_priority
和cancellable
(同上)。callback
:我们可以在哪里 运行 一个函数或代码来实际检索文件。
下面是执行此操作的最终代码。
const { Gio, GLib, GObject, Gtk } = imports.gi; // import Gio and GLib API at top of your document.
_onFolderChosen() {
let folder = this._folderChooseButton.get_file();
let files = folder.enumerate_children_async(
'standard::name',
Gio.FileQueryInfoFlags.NONE,
GLib.PRIORITY_DEFAULT,
null,
(source, result, data) => {
this._fileEnumerator = null;
try {
this._fileEnumerator = folder.enumerate_children_finish(result);
} catch (e) {
log('(Error) Could not retreive list of files! Error:' + e);
return;
}
this._readNextFile();
});
}
_readNextFile() {
if (!this._fileEnumerator)
return;
let fileInfo = null;
this._fileEnumerator.next_files_async(
1,
GLib.PRIORITY_DEFAULT,
null,
(source, result, data) => {
try {
fileInfo = this._fileEnumerator.next_files_finish(result);
} catch (e) {
log('Could not retreive the next file! Error:' + e);
return;
}
let file = fileInfo[0].get_name();
let filePath = GLib.build_filenamev([this._folderChooseButton.get_filename(), file]);
this._carousselImage.set_from_file(filePath);
});
}