Java-Incolla un file dagli appunti dopo che è stato scaricato


Ho qualche problema con Esplora risorse di Windows.

La mia applicazione avvia il download di un file e lo inserisce negli appunti di sistema nel frattempo. Se l'utente ora incolla il file in qualche punto di Windows Explorer, il file non ha la sua dimensione reale, ma la dimensione in base allo stato di avanzamento del download.

Qualcuno ha un'idea di come potrei consigliare all'Esploratore di attendere fino al termine del download e copiare il file nella directory di destinazione dopo?

Ho anche provato a "tunnel" il file sull'interfaccia di loopback usando il server SMB locale, ma sfortunatamente non è stato di aiuto...

Grazie in anticipo

Scaricare il file e chiamare il metodo Incolla negli appunti:

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

Copia del file negli appunti:

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

Quello che stai facendo è semplicemente sbagliato. Non mettere qualcosa negli appunti a meno che non sia pronto per essere incollato: stai infrangendo il contratto che dovresti seguire quando usi gli appunti.

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

Forse la mia risposta è un po ' semplicistica, ma perché non aspettare semplicemente che il file sia completamente scaricato prima di impostarlo negli appunti? Che ne dici di usare qualcosa come un futuro per aspettarlo, quindi impostarlo negli appunti.

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

Questo...

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

È così sbagliato da essere sbalorditivo. Si desidera solo aggiungere where a fileList ma solo dopo che è stato scaricato correttamente.

Una volta che il file è stato scaricato, solo allora si desidera aggiungere negli appunti.

La creazione del tuo Transferable è anche un" piccolo " preoccupante, il Transferable dovrebbe fare una copia del File List nel momento in cui viene creato, ciò impedisce che l'elenco sia stato modificato prima che venga utilizzato, il che potrebbe modificare risultati

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

In linguaggi come C++ o Delphi è possibile mettere negli appunti IDataObject oggetto. L'oggetto IDataObject può contenere formati assolutamente diversi. Se è possibile incollare IDataObject con i formati CFSTR_FILEDESCRIPTOR e CFSTR_FILECONTENTS negli appunti, il problema verrà risolto.

Quando la shell richiede file dagli appunti controlla i formati CF_HDROP, CF_IDLIST, CF_FILEDESCRIPTORW/CF_FILEDESCRIPTORA o CF_FILENAMEW/CF_FILENAMEA. E se appunti contiene CF_FILEDESCRIPTOR formato solo shell utilizzerà questo formato per il trasferimento di file.

Il formato CF_FILEDESCRIPTOR contiene nomi, attributi e date dei file. CF_FILECONTENTS formato contiene IStream di file. E sei assolutamente libero di creare qualsiasi implementazione dell'oggetto IStream. Quando la shell chiama IStream.Leggere e richiedere la parte del file che è già stato scaricato basta restituire questa parte del file. Ma quando la shell chiama IStream.Leggere e richiedere la parte del file che non è ancora stato scaricato-solo attendere e dopo che la parte è stata scaricata restituirla.

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