FileChannel : interrompre un transferFrom / transferTo
Hello,
J'utilise, pour la copie de fichiers potentiellement très gros, des FileChannel :
Code:
1 2 3
| in = new FileInputStream(source).getChannel();
out = new FileOutputStream(dest).getChannel();
pos = out.transferFrom(in, 0, in.size()); |
Le problème vient lorsque j'essaye d'annuler l'opération en cours.
Je précise que je n'ai effectué mes tests que sous Windows (XP en l'occurence), il se peut que le problème ne se pose pas sur les autres OS.
J'ai essayé (entre autres), depuis un autre thread :- de fermer les channels avec close()
- de fermer les FileInputStream et FileOutputStream d'où sont issus les channels
- de lancer une interruption sur le thread effectuant la copie
- le cradissime stop() sur le thread effectuant la copie
- le tout avec et sans lock sur le channel de sortie
mais rien à faire, le transfert continue jusqu'au bout.
Tout se passe comme si il délèguait au système (en l'occurence au DMA) la tâche de copier le fichier et attendait sagement qu'il ai fini pour retourner, ou presque.
En effet, le thread effectuant la copie, tout comme celui essayant de faire un close(), stop() ou interrupt() se bloquent jusqu'à ce que la copie soit bien avancée, puis continuent d'un seul coup. Le système n'a alors pas encore fini la copie (si on essaye de voire le fichier dans l'explorateur, ce dernier freeze, il faut attendre quelques secondes que la copie se termine pour qu'il réagisse de nouveau).
:bug:
Comment faire pour interrompre proprement mais immédiatement cette copie ?