Vérifier si le fichier est déjà ouvert
J'ai besoin d'écrire un Fichier de commandes personnalisé renommeur de fichiers. J'ai l'essentiel de ce fait sauf que je n'arrive pas à comprendre comment faire pour vérifier si un fichier est déjà ouvert. Je suis juste en utilisant le java.io.File
paquet et il y a un canWrite()
méthode mais ça ne semble pas pour tester si le fichier est en cours d'utilisation par un autre programme. Des idées sur comment je peut faire ce travail?
- C'est dépend de la plateforme. Quelle plate-forme est-ce pour?
- Windows 2003 Serveur
- Juste utilisé votre question en cause, vous pourriez avoir à le faire en appelant la WinAPI utilisant JNI ou de la JNA.
- peut-être, mais nous allons pas sauter le pistolet
- Même si vous pouvez dire c'est ouvert, il y aurait une course conditioon faire quelque chose avec elle.
Vous devez vous connecter pour publier un commentaire.
À l'aide de l'Apache Commons IO bibliothèque...
(Le Q&A est sur la façon de traiter avec Windows "ouvrir le fichier" verrous ... pas comment mettre en oeuvre ce type de verrouillage de façon portable.)
Toute cette question se heurte à des problèmes de portabilité et des conditions de course:
FileLock
ou autre chose, vous avez encore le problème que quelque chose peut venir et ouvrir le fichier d'entre vous de tester le fichier et de faire le changement de nom.Plus simple si les non-portable solution est simplement d'essayer de le renommer (ou peu importe ce que vous essayez de le faire) et de diagnostiquer la valeur de retour et /ou Java exceptions qui surviennent en raison de fichiers ouverts.
Notes:
Si vous utilisez le
Files
API au lieu deFile
API, vous obtiendrez plus d'informations en cas de panne.Sur les systèmes (par exemple Linux) où vous êtes autorisé à renommer un blocage ou d'ouvrir le fichier, vous n'aurez pas de panne de résultat ou à des exceptions. L'opération va réussir juste. Cependant, sur ces systèmes, vous n'avez généralement pas besoin de s'inquiéter si un fichier est déjà ouvert, puisque le système ne permet pas de verrouiller les fichiers à ouvrir.
Sur Windows, j'ai trouvé la réponse https://stackoverflow.com/a/13706972/3014879 à l'aide de
fileIsLocked = !file.renameTo(file)
plus utile, car elle permet d'éviter les faux positifs lors du traitement d'écrire des fichiers protégés.
org.apache.commons.io.FileUtils.touch(yourFile)
n'est pas de vérifier si votre fichier est ouvert ou pas. Au lieu de cela, il modifie la date de modification du fichier, à l'heure actuelle.J'ai utilisé IOException et il fonctionne très bien:
fw
ouvert dans le cas qui n'a pas de générer une exception.Je ne pense pas que vous obtiendrez jamais une solution définitive pour ce faire, le système d'exploitation ne va pas nécessairement de vous dire si le fichier est ouvert ou pas.
Vous pourriez obtenir quelques kilométrage de
java.nio.channels.FileLock
, bien que la javadoc est chargé avec des mises en garde.Salut j'espère vraiment que cette aide.
J'ai essayé toutes les options avant et aucun vraiment travailler sur Windows. La seule chose qui m'a aidé à accomplir ce travail a été d'essayer de déplacer le fichier. Événement à la même place sous un ATOMIC_MOVE. Si le fichier est écrit par un autre programme ou d'un fil de Java, ce sera certainement produire une Exception.
Si le fichier est en cours d'utilisation
FileOutputStream fileOutputStream = new FileOutputStream(file);
retourne java.io.FileNotFoundException avec "Le processus ne peut pas accéder au fichier car ce fichier est utilisé par un autre processus" dans le message d'exception.