2

好的,所以我正在开发一个应用程序,它允许用户在菜单中选择文件对象,并允许他们将所述选择复制到另一个位置。到目前为止,我已经设法使用 pywin32 模块来允许我使用 Windows 的本机文件复制器来复制文件。

它的代码:

from win32com.shell import shell, shellcon
srcstr = chr( 0 ).join( [ file[0] for file in files ] )
deststr = chr( 0 ).join( [ file[1] for file in files ] )
shell.SHFileOperation(
    ( 0, shellcon.FO_COPY, srcstr, deststr, shellcon.FOF_MULTIDESTFILES, None, None )
)

这是在 Windows 下复制的好方法,但我想知道是否有办法在 Mac 和/或 Linux 下实现相同的目标。

4

5 回答 5

1

你考虑过shutil(http://docs.python.org/library/shutil.html)吗?该模块提供了这种高级文件操作,同时保持与操作系统无关。

于 2012-06-26T05:25:54.760 回答
1

在 Mac 上执行此操作的另一种方法是通过 PyObjC 使用 NSWorkspace。像这样:

from Cocoa import *
ws = NSWorkspace.sharedWorkspace()
ws.performFileOperation_source_destination_files_tag_(NSWorkspaceCopyOperation,
    '/dirname/of/source', '/dest/directory', ['basenameOfSource'], None)

问题是这实际上并不能保证与 Finder 做同样的事情。对于大副本,它通常会,但对于较小的副本,可能根本没有反馈。

另外,如果您想获得任何反馈,您必须存储 ret[1] 并注册 NSWorkspace 通知 NSWorkspaceDidPerformFileOperationNotification,这意味着您需要一个运行循环。

于 2012-06-26T06:00:14.940 回答
0

在 Mac 上,您需要编写 Finder 脚本。

一种方法是使用 ScriptingBridge。首先:

import ScriptingBridge
f = ScriptingBridge.SBApplication.applicationWithBundleIdentifier_("com.apple.Finder")

然后……好吧,启动 AppleScript Editor,查看 Finder 的字典,并弄清楚如何将 AppleScript 翻译成 Python+ScriptingBridge,如果您有任何问题,请再回来询问。但这里有一些提示:

诀窍是从路径到 Finder 引用。而且没有简单的方法可以直接到达那里。相反,您必须从 startupDisk 开始,在其上调用文件夹(),过滤 name == path 的第一个组件,然后重复。请参阅http://developer.apple.com/library/mac/#samplecode/ScriptingBridgeFinder/Listings/Controller_m.html(它是用 Objective C 而不是 Python 编写的,但 ScriptingBridge 部分很容易翻译)。

于 2012-06-26T05:39:57.680 回答
0

该解决方案可能是特定于操作系统/桌面的;例如在 GNOME 上,您需要使用 DBus 与 Nautilus 进行通信。

有人询问文档,显然没有:Where to find information about Nautilus D-Bus interface

并且此线程表明您需要的功能可能存在于当前版本的 Nautilus 中: https ://askubuntu.com/questions/52093/how-can-i-initiate-nautilus-file-operations-from-the-command-线

但要支持 OS X、KDE ​​等,您可能必须为每个工作。

于 2012-06-26T05:40:15.030 回答
0

我不羡慕这项任务。为了实现这一点,您并不是针对“Linux”,而是针对桌面环境 X、Y、Z 等(以及每个环境的不同版本)。这不仅仅是 KDE 与 Gnome,它是 KDE 3/4 与 Gnome 2/3 与 Enlightment 与 Xfce4 与 Blackbox 与 TWM 等。

您可以使用 GTK 或 WXwidgets 之类的库获得跨桌面文件选择器,但我认为其中任何一个都没有用于复制操作的进度小部件(您必须自己编写代码)并且它们看起来不是“原生“ 任何一个。

一般来说,虽然我不认为本机复制对话框真的是大多数 linux 用户会关心的东西。我们习惯了看起来不同的程序,我们学会了与之共存。

无论如何,我推荐GtkProgressBarwxProgressDialog,因为这两个库都应该很容易完成这项任务,并且两个库都有 python 绑定。

于 2012-06-26T05:52:56.833 回答