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