2016-05-31 8 views
0

私はPython上でデスクトップアプリケーションを作成しました。ユーザにアプリケーションウィンドウに表示されたファイルをコピーできるようにする必要があります。Windowsエクスプローラ彼らは彼らが望むところにいる。Windows上のPythonでファイルをメモリにコピーする方法

Windowsの「右クリックしてコピーする」または「ctrl + V」と同様です。 私は、ユーザが「ペースト」をクリックしたときにそのファイルが

表示されます

shutil.copy(src, dst) 
Copy the file src to the file or directory dst. If dst is a directory, a file with the same basename as src is created (or overwritten) in the directory specified. Permission bits are copied. src and dst are path names given as strings. 

shutil使用しています。しかし、私はメモリに保存したい1つのディレクトリからファイルをコピーするためのPythonの機能のみを見つけました

どうすればいいですか?

+1

"python add to clipboard"を検索しましたか?あなたのコードは、実際にあるソースの送り先から別の送り先にコピーすることにのみ関連しています。あなたの質問は、あなたが達成したいことを研究、コード化、テストすることを私たちに求めているので、質問よりも課題が多いと今のところです。それは、このコミュニティがお互いに通常行うことではありません。 FAQを見たり、あなたの質問をコードで更新してください。これを解決するための何らかの努力を示しています。これはやや関連性が高く、達成しようとしているものに近いものです。 – Torxed

+1

はい、私は検索しましたが、プレーンテキストまたはイメージタイプのファイルをクリップボードにコピーする方法しか見つかりませんでした。 まあ、私は何をコードすることはできませんどのように行うべきか分からない、それは私が –

答えて

3

必要なクリップボードの形式はCF_HDROPです。例:

import ctypes 
from ctypes import wintypes 
import pythoncom 
import win32clipboard 

class DROPFILES(ctypes.Structure): 
    _fields_ = (('pFiles', wintypes.DWORD), 
       ('pt',  wintypes.POINT), 
       ('fNC', wintypes.BOOL), 
       ('fWide', wintypes.BOOL)) 

def clip_files(file_list): 
    offset = ctypes.sizeof(DROPFILES) 
    length = sum(len(p) + 1 for p in file_list) + 1 
    size = offset + length * ctypes.sizeof(ctypes.c_wchar) 
    buf = (ctypes.c_char * size)() 
    df = DROPFILES.from_buffer(buf) 
    df.pFiles, df.fWide = offset, True 
    for path in file_list: 
     array_t = ctypes.c_wchar * (len(path) + 1) 
     path_buf = array_t.from_buffer(buf, offset) 
     path_buf.value = path 
     offset += ctypes.sizeof(path_buf) 
    stg = pythoncom.STGMEDIUM()  
    stg.set(pythoncom.TYMED_HGLOBAL, buf) 
    win32clipboard.OpenClipboard() 
    try: 
     win32clipboard.SetClipboardData(win32clipboard.CF_HDROP, 
             stg.data) 
    finally: 
     win32clipboard.CloseClipboard() 

if __name__ == '__main__': 
    import os 
    clip_files([os.path.abspath(__file__)]) 
関連する問題