Comment déterminer si un fichier sera logiquement déplacé ou déplacé physiquement
-
09-09-2019 - |
Question
Les faits:
Lorsqu'un fichier est déplacé, il y a deux possibilités:
- 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
- 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
?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?)