Java-Collez un fichier du presse-papiers après qu'il a été téléchargé


J'ai quelques problèmes avec l'Explorateur Windows.

Mon application démarre le téléchargement d'un fichier et le met dans le presse-papiers du système pendant ce temps. Si l'utilisateur colle maintenant le fichier à un endroit de l'Explorateur Windows, le fichier n'a pas sa taille réelle, mais la taille en fonction de la progression du téléchargement.

Quelqu'un a-t-il une idée de la façon dont je pourrais conseiller à l'Explorateur d'attendre la fin du téléchargement et de copier le fichier dans le répertoire cible par la suite?

J'ai également essayé de "tunnel" le fichier sur l'interface de bouclage en utilisant le serveur SMB local mais cela n'a malheureusement pas aidé...

Merci d'avance

Télécharger le fichier et appeler la méthode coller dans le presse-papiers:

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();

Copie du fichier dans le presse-papiers:

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);

}
Author: Aurus, 2015-04-09

4 answers

Ce que vous faites est tout simplement faux. Ne mettez pas quelque chose dans le presse-papiers à moins qu'il ne soit prêt à être collé-vous rompez le contrat que vous devriez suivre lors de l'utilisation du presse-papiers.

 0
Author: Marcus Müller, 2015-04-09 20:57:58

Peut-être que ma réponse est un peu simpliste, mais pourquoi ne pas simplement attendre que le fichier soit complètement téléchargé avant de le définir dans le presse-papiers? Qu'en utilisant quelque chose comme un Futur pour l'attendre, puis le mettre dans le presse-papiers.

 0
Author: Math, 2015-04-09 20:58:04

Ceci...

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

Est tellement faux qu'il est ahurissant. Vous voulez seulement ajouter le where au fileList mais seulement APRÈS qu'il a été téléchargé avec succès.

Une fois que le fichier a été téléchargé, alors seulement voulez-vous l'ajouter au presse-papiers.

La création de votre Transferable est aussi un" petit " troublant, le Transferable devrait faire une copie du File List au moment de sa création, cela empêche la liste d'être modifiée avant son utilisation, ce qui pourrait changer la résultats

 0
Author: MadProgrammer, 2015-04-09 21:15:42

Dans des langages comme C++ ou Delphi, il est possible de mettre dans le presse-papiers l'objet IDataObject. L'objet IDataObject peut contenir des formats absolument différents. Si vous pouvez coller IDataObject avec les formats CFSTR_FILEDESCRIPTOR et CFSTR_FILECONTENTS dans le presse-papiers, votre problème sera résolu.

Lorsque le shell demande des fichiers à partir du presse-papiers, il vérifie les formats CF_HDROP, CF_IDLIST, CF_FILEDESCRIPTORW/CF_FILEDESCRIPTORA ou CF_FILENAMEW/CF_FILENAMEA. Et si le presse-papiers contient Format CF_FILEDESCRIPTOR seul le shell utilisera ce format pour le transfert de fichiers.

Le format CF_FILEDESCRIPTOR contient les noms, les attributs et les dates des fichiers. Le format CF_FILECONTENTS contient IEam du fichier. Et vous êtes absolument libre de créer n'importe quelle implémentation d'objecteam object. Lorsque le shell appelle Ieam.Lire et demander la partie du fichier qui est déjà téléchargé juste retourner cette partie du fichier. Mais quand shell appelle Ieam.Lisez et demandez la partie du fichier qui n'est pas encore téléchargée-juste attendez et après le téléchargement de la pièce, retournez-la.

 0
Author: Denis Anisimov, 2015-04-10 08:55:14