Java - 下载后从剪贴板粘贴文件

时间:2015-04-09 20:53:58

标签: java windows clipboard explorer

我在使用Windows资源管理器时遇到了一些问题。

我的应用程序开始下载文件并同时将其放入系统剪贴板。如果用户现在将文件粘贴到Windows资源管理器的某个位置,则该文件的实际大小不是很大,而是大小取决于下载的进度。

有人知道我如何建议资源管理器等到下载完成后再将文件复制到目标目录吗?

我还尝试使用本地SMB服务器在loopback接口上“隧道”文件,但不幸的是它没有帮助......

提前致谢

下载文件并调用粘贴到剪贴板方法:

new Thread(new Runnable() {

            @Override
            public void run() {

                final String where = getText();

                int selectedRows[] = CustomJTableModel.table.getSelectedRows();

                List<File> fileList = new ArrayList<File>();

                for( int i=0; selectedRows.length>i; i++ ) {

                    // Build the relative file/folder path

                    String fileName = (String)table.getValueAt(table.getSelectedRow(), 0);

                    final String value = buildPath(where, fileName);

                    new Thread(new Runnable() {

                        @Override
                        public void run() {

                            staticNetworkDaemon.getFile(value, where);

                        }

                    }).start();

                    fileList.add(new File("\\\\127.0.0.1\\r$\\downloaded" + value.replace("/", "\\")));

                }

                setClipboardFile(fileList);

            }

        }).start();

将文件复制到剪贴板:

public static void setClipboardFile(final List<File> files) {

    Transferable trans = new Transferable() {

        List<File> fileList = new ArrayList<File>();

        public DataFlavor[] getTransferDataFlavors() {

            for( File f: files ) {

                fileList.add(f);

            }

            return new DataFlavor[] { DataFlavor.javaFileListFlavor };

        }

        public boolean isDataFlavorSupported(DataFlavor flavor) {

            return DataFlavor.javaFileListFlavor.equals(flavor);

        }   

        public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {

            if (isDataFlavorSupported(flavor))

                return fileList;

            throw new UnsupportedFlavorException(flavor);

        }

    };

    Toolkit.getDefaultToolkit().getSystemClipboard().setContents(trans, null);

}

4 个答案:

答案 0 :(得分:0)

你在做什么是完全错误的。除非准备好粘贴,否则不要在剪贴板中放置东西 - 你违反了使用剪贴板时应该遵循的合同。

答案 1 :(得分:0)

也许我的答案有点简单,但为什么不等到文件完全下载后再将其设置在剪贴板中?如何使用像Future这样的东西等待它,然后将它设置在剪贴板中。

答案 2 :(得分:0)

此...

fileList.add(new File("\\\\127.0.0.1\\r$\\downloaded" + value.replace("/", "\\")))

难以令人难以置信。您只想将where添加到fileList,但仅限于已成功下载后。

文件下载后,才想将其添加到剪贴板。

Transferable的创建也是一个小小的&#34;令人不安的是,Transferable应该在创建File List时制作副本,这可以防止List在使用之前被修改,这可能会改变结果

答案 3 :(得分:0)

在C ++或Delphi等语言中,可以将剪贴板IDataObject对象放入其中。 IDataObject对象可以包含完全不同的格式。如果您可以将带有CFSTR_FILEDESCRIPTORCFSTR_FILECONTENTS格式的IDataObject粘贴到剪贴板,那么您的问题就会得到解决。

当shell从剪贴板请求文件时,它会检查CF_HDROP,CF_IDLIST,CF_FILEDESCRIPTORW / CF_FILEDESCRIPTORA或CF_FILENAMEW / CF_FILENAMEA格式。如果剪贴板包含CF_FILEDESCRIPTOR格式,则只有shell将使用此格式进行文件传输。

CF_FILEDESCRIPTOR格式包含文件的名称,属性和日期。 CF_FILECONTENTS格式包含文件的IStream。并且你完全可以自由地创建任何IStream对象的实现。当shell调用IStream.Read并请求已下载的文件部分时,只返回该部分文件。但是当shell调用IStream.Read并请求尚未下载的文件部分时 - 只需等待并在部件下载后返回它。