Question

Les faits:

Lorsqu'un fichier est déplacé, il y a deux possibilités:

  1. La source et le fichier de destination sont sur la même partition et seul l'index du système de fichiers est mis à jour
  2. La source et la destination sont sur deux systèmes de fichiers différents et le fichier doivent être déplacés octet par octet. (Copier alias sur le mouvement)

La question:

Comment puis-je déterminer si un fichier sera soit logique ou déplacé physiquement?

Je transférer des fichiers volumineux (plus de 700 megs) et adopterait un comportement différent pour chaque situation.


Edit:

Je l'ai déjà codé une boîte de dialogue de fichier se déplaçant avec un thread de travail qui effectuent le blocage io appeler pour copier le fichier un meg à la fois. Il fournit des informations à l'utilisateur comme estimation approximative du temps restant et le taux de transfert.

Le problème est: comment puis-je savoir si le fichier peut être déplacé logiquement avant d'essayer de le déplacer physiquement

?
Était-ce utile?

La solution 2

Ok je suis sur quelque chose:)

Utilisation JNA Je suis en mesure de appeler la API Win32 (* API et nix aussi) java .

J'ai essayé d'appeler GetFileInformationByHandle et a obtenu un résultat ne mais le dwVolumeSerialNumber attribut est toujours égal à 0 (essayé avec mon C: et D: lecteur)

Alors j'ai vu cette fonction sur MSDN: MoveFileEx. Lorsque le parametter de drapeau est réglé sur 0, la copie sur fonction de déplacement sera désactiver. ET FONCTIONNEMENT !!!!

Je vais donc simplement appeler

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

Voici le code à mettre dans l'interface Kernel32.java (ce fichier se trouve dans le package src.zip dans la section de téléchargement du JNA site):

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;

Autres conseils

Sur Linux ou d'autres * nices, appelez stat() sur les répertoires source et de destination et de comparer leurs valeurs st_dev. Si elles sont les mêmes, un mouvement logique peut être effectuée, sinon une copie physique + suppression doit être effectuée.

Sous Windows, vous pouvez appeler GetFileInformationByHandle() sur les poignées des deux répertoires et de comparer leurs valeurs dwVolumeSerialNumber. Notez que cela nécessite Windows 2000 ou version ultérieure.

Je vois que vous utilisez Java - il doit y avoir un portail à travers lequel vous pouvez accéder à cette information OS-niveau

(peut-être JNI?)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top