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 ) を検討しましたか? このモジュールは、OS に依存しないまま、そのような高レベルのファイル操作を提供します。

于 2012-06-26T05:25:54.760 に答える
1

Mac でこれを行うもう 1 つの方法は、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 のスクリプトを作成する必要があります。

これを行う 1 つの方法は、ScriptingBridge を使用することです。で開始する:

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

それから…​​まあ、AppleScript エディターを起動し、Finder の辞書を見て、それを AppleScript から Python+ScriptingBridge に変換する方法を見つけます。問題があれば、戻ってもう一度質問してください。しかし、ここにいくつかのヒントがあります:

秘訣は、パスから Finder 参照への取得です。そして、そこに直接行く簡単な方法はありません。代わりに、startupDisk から開始し、その上で folder() を呼び出し、名前 == パスの最初のコンポーネントでフィルター処理し、繰り返す必要があります。http://developer.apple.com/library/mac/#samplecode/ScriptingBridgeFinder/Listings/Controller_m.htmlを参照してください(Python ではなく Objective C で記述されていますが、ScriptingBridge の部分は簡単に翻訳できます)。

于 2012-06-26T05:39:57.680 に答える
0

解決策は、OS/デスクトップ固有のものになる可能性があります。たとえば 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 ユーザーが気にするものではないと思います。私たちは見た目が異なるプログラムに慣れており、それと一緒に暮らすことを学びます.

とにかく、GtkProgressBarまたはwxProgressDialogをお勧めします。どちらもこのタスクを実行するのがかなり簡単で、両方のライブラリに Python バインディングがあるからです。

于 2012-06-26T05:52:56.833 に答える