Domanda

I fatti:

Quando un file viene spostato, ci sono due possibilità:

  1. La sorgente e file di destinazione sono sulla stessa partizione e solo l'indice del file system viene aggiornato
  2. L'origine e la destinazione sono su due diversi file di sistema e il file devono essere spostati di byte per byte. (Aka copia in movimento)

La domanda:

Come posso determinare se un file sarà spostato sia logicamente o fisicamente?

Sono il trasferimento di file di grandi dimensioni (700 + megs) e adotterebbe una comportamenti diversi per ogni situazione.


Modifica:

Ho già codificato una finestra di dialogo che si muove con un thread di lavoro che svolgono la bloccando io chiamano per copiare il file di un meg alla volta. Si forniscono informazioni all'utente come stima approssimativa del tasso di tempo e di trasferimento rimanente.

Il problema è: come faccio a sapere se il file può essere spostato logicamente prima di tentare di spostare fisicamente

?
È stato utile?

Soluzione 2

Ok Sono su qualcosa:)

Utilizzando JNA sono in grado di chiamare il API Win32 (e * nix API troppo) da Java .

Ho provato a chiamare GetFileInformationByHandle e ho ottenuto un risultato, ma attribuire la dwVolumeSerialNumber è sempre uguale 0 (provato con la mia C: e D: azionamento)

Poi ho visto questa funzione su MSDN: MoveFileEx . Quando il parametter flag è impostato su 0, la funzione di copia su mossa sarà disabilitata. e funziona !!!!

Così mi limito a chiamare

if (!Kernel32.INSTANCE.MoveFileEx(source.getAbsolutePath(), destination.getAbsolutePath(), 0)) {
    System.out.println("logical move failed");
}

Ecco il codice per mettere nell'interfaccia Kernel32.java (questo file può essere trovata nel pacchetto src.zip nella sezione download del JNA del sito):

boolean MoveFileEx(String lpExistingFileName, String lpNewFileName, int dwFlags);

int MOVEFILE_REPLACE_EXISTING = 0x01;
int MOVEFILE_COPY_ALLOWED = 0x02;
int MOVEFILE_CREATE_HARDLINK = 0x04;
int MOVEFILE_WRITE_THROUGH = 0x08;
int MOVEFILE_DELAY_UNTIL_REBOOT = 0x10;
int MOVEFILE_FAIL_IF_NOT_TRACKABLE = 0x20;

Altri suggerimenti

Su Linux o altri nices *, chiamare stat() sulle directory di origine e destinazione e confrontare i loro valori st_dev. Se sono le stesse, una mossa logica può essere eseguita, altrimenti una copia fisica + delete deve essere eseguita.

In Windows, è possibile chiamare GetFileInformationByHandle() sulle maniglie per le due directory e confrontare i loro valori dwVolumeSerialNumber. Si noti che questo richiede Windows 2000 o versione successiva.

Vedo che stai utilizzando Java - ci deve essere qualche portale attraverso il quale è possibile accedere a queste informazioni a livello di OS

(forse JNI?)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top