如何使用 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()函数有五个参数:

  1. 逗号分隔的属性列表。在我们的例子中,因为我们想要目录中子项的标识符,所以我们想要使用名为 standard::name.

  2. 的属性
  3. FileQueryInfoFlag:这允许跟随或不跟随符号链接。在这种情况下,我们将使用 FileQueryInfoFlag.NONE,它不会跟随符号链接。

  4. io_priority:IO操作应该有多高的优先级(我们将使用GLib.PRIORITY_DEFAULT

  5. cancellable:一个cancelable,就是取消这个操作的一种方式,在这种情况下我们将其保留为null。

  6. callback:这是您想要运行响应已检索文件的function/code。

有关此功能的更多信息位于 GJS-Docs at GNOME.org

enumerate_children_async() 函数 returns a GFileEnumerator,我们可以通过调用 next_files_async() 来检索一些文件,它采用以下参数:

  1. num_files:您要检索多少个文件。在您的情况下,我们使用 1.

  2. io_prioritycancellable(同上)。

  3. 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);
  });
}