在默认文件管理器中打开目录并选择一个文件


9

在我正在编写的程序中,我想提供打开我当前正在处理的文件所在目录的功能,并自动选择该文件(以便用户无需搜索)。

我知道我可以使用以下命令在默认文件管理器中打开目录

xdg-open /path/to/directory

我知道我可以在nautilus中打开目录并使用以下命令选择文件

nautilus /path/to/file.txt

以为我可以用

xdg-mime query default inode/directory

获取默认的文件管理器,如果是鹦鹉螺,则按上面所示进行调用。但是,尽管事实上鹦鹉螺是我系统上的默认设置(xdg-open打开鹦鹉螺,gnome shell中的places菜单也会打开),xdg-mime仍会返回Thunar.desktop。(我已经尝试过,find / -name Thunar.desktop -mount 2>/dev/null但是没有找到任何东西。)

另外,我不知道如何打开一个目录,然后选择一个子目录中的鹦鹉螺(与上面提到的方法,将打开子目录)。

我怎样才能打开默认的文件管理器的目录,并选择在该目录中的文件(如果选择一个目录,也很可能将是巨大的,但是对于这种应用并不需要),或至少找出默认的文件管理器,这样我可以直接打电话吗?

Answers:


6

1.要打开目录并在nautilus中选择一个子目录/文件:

nautilus --select path/to/file/or/directory

来自nautilus(1)手册页

-s,--
  select在父文件夹中选择指定的URI。

2. xdg-mime返回Thunar.desktopxdg-open打开nautilus

xdg-mime用于mimeapps.list确定要使用的默认应用程序。

mimeapps.list存在单独的文件来处理特定于用户,特定于系统和特定于分发的需求。他们的查找顺序可以在这里找到。

mimeapps.list在[默认应用程序]部分下列出给定mimetype的默认应用程序。它允许按优先级从高到低的顺序列出多个默认应用程序。例如 :

[Default Applications]
mimetype1 = default1.desktop;default2.desktop;

其中mimetype1是mime类型,*。desktop是桌面文件。

xdg-open在首选项列表中按查找顺序搜索桌面文件,直到找到有效的桌面文件。如果在所有文件中都没有找到这样的文件,则根据关联选择最喜欢的一个文件,并将其用作默认应用程序。

因此,在我们的示例中,让我们假设default1.desktop系统中不存在该xdg-open文件,因此将尝试使用打开文件default2.desktop。但是,xdg-mime返回 default1.desktop是我们mimeapps.list文件中的第一项。

因此,您的情况default1.desktop必须是Thunar.desktop输出。但是,它尚未安装在您的系统上。因此,xdg-open打开nautilus系统上存在的文件/目录。要验证这一点,您可以检查mimeapps.list文件中是否包含inode/directory。对于Ubuntu 17.10,mimeapps.list文件位置为:/usr/share/applications/defaults.list

注意:可以在此处找到确定“默认应用程序”的完整算法。


如果仍然无法解决问题或有任何混淆,请发表评论。
阿米特·辛格

1
您的出色答案乍看起来就像是一个问题(这是删除原因),它可能会误导审稿人,因此我对其进行了一些编辑。如果不行,请随时回滚。
彼得-恢复莫妮卡

@peterh感谢您的编辑!我会牢记在心,以备将来使用。
阿米特·辛格

+1。非常感谢您的回答。第一部分工作正常。第二部分与本说明一起说明了如果未设置环境变量则假定使用哪些值,从而说明了为什么返回Thunar。
jakun

1
但是,我仍然无法追溯为什么启动Nautilus,因为它没有在中指定mimeapps.list。您能否在“如果处理完所有文件之后,我们还没有找到默认应用程序,请选择最支持该类型的应用程序(根据关联)”中说明这些关联是什么?您是否知道如何找出需要重新实现此算法的自动启动程序的方法?
jakun

0

您可能要考虑使用dbus打开文件,因为它很快变得越来越流行。

仅当您仅专注于“默认”文件管理器时,才真正存在“默认”文件管理器的概念xdg-mime,但是在dbus领域以及实际上大多数应用程序中,情况都发生了不同的变化,而“默认”文件管理器的概念不再存在。

这是/home/me/path/to/folder/or/file使用dbus在(默认?)文件管理器中打开文件()的方式:

dbus-send --session --print-reply --dest=org.freedesktop.FileManager1 --type=method_call /org/freedesktop/FileManager1 org.freedesktop.FileManager1.ShowItems array:string:"file:///home/me/path/to/folder/or/file" string:""

该命令的作用是查找实现该org.freedesktop.FileManager1接口的任何dbus服务,并使用您要打开的文件的路径调用它。

我在默认值之后加上问号的原因是因为dbus不尊重“默认”文件管理器的概念。它所做的只是将调用发送到它发现的实现接口并让其处理操作的第一个服务。现在,它选择的应用程序可能是您的“默认”文件管理器,但这并不总是保证。

dbus默认情况下,大多数现代应用程序将使用默认值,xdg-mime如果dbus调用失败,则会回退,所以我建议您这样做。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.