我正在制作一个带有GJS的GTK+3应用程序,用户从GtkFileChooserButton(action
属性设置为select-folder
)中选择一个文件夹。我想在用户选择的给定文件夹中查找所有图像文件,以便我可以显示其中一个图像。
我尝试了this._fileChooserButton.get_files()
和this._folderChooseButton.get_uris()
但他们只返回一个文件,即所选文件夹的路径。喜欢这个:
_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 中我不太清楚,如何找出用户所选目录(和子目录)内的哪些图像文件?
好的,在瓜德克的帕特里克、乔治和马蒂亚斯的帮助下,这就是我得到的。
我尝试的get_file()
函数返回一个 GFile,在本例中它是一个文件夹(在 UNIX 中,文件夹也是文件)。为了获取目录路径中的文件,我们需要在 GFile 上调用enumerate_children_async()
,由get_file()
函数返回。
enumate_children_async()
函数采用五个参数:
-
逗号分隔的属性列表。在我们的例子中,由于我们想要目录中子项的标识符,因此我们希望使用名为
standard::name
. -
FileQueryInfoFlag
:这允许关注或不关注符号链接。在这种情况下,我们将使用不遵循符号链接的FileQueryInfoFlag.NONE
。 -
io_priority
:IO 操作应该具有多高的优先级(我们将使用GLib.PRIORITY_DEFAULT
) -
cancellable
:可取消,这是取消此操作的一种方式,在这种情况下,我们将将其保留为null。 -
callback
:这是您要运行的函数/代码,以响应已检索的文件。
有关此函数的更多信息,请访问 GJS-Docs at GNOME.org
enumerate_children_async()
函数返回一个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);
});
}