J'ai eu le même problème et la solution suivante a fonctionné pour moi. Tentative précédente infructueuse - J'ai essayé de surveiller l'état "lastModifiedTime" de chaque fichier, mais j'ai remarqué que la croissance de la taille d'un gros fichier peut faire une pause pendant un certain temps (la taille ne change pas continuellement).
Idée de base - Pour chaque événement, créez un fichier de déclenchement (dans un répertoire temporaire) dont le nom est au format suivant : - 1.
Nom du fichier original_dernier temps modifié_nombre d'essais
Ce fichier est vide et tout le jeu est seulement dans le nom. Le fichier original ne sera pris en compte qu'après avoir passé des intervalles d'une durée spécifique sans changement dans son statut "last Modified time". (Note - comme il s'agit d'une statistique de fichier, il n'y a pas de surcharge -> O(1)).
NOTE - Ce fichier de déclenchement est géré par un service différent (disons " "). Déclencheur de fichiers ').
Avantage -
- Pas de sommeil ou d'attente pour retenir le système.
- Soulage l'observateur de fichiers pour surveiller d'autres événements.
CODE pour FileWatcher -
val triggerFileName: String = triggerFileTempDir + orifinalFileName + "_" + Files.getLastModifiedTime(Paths.get(event.getFile.getName.getPath)).toMillis + "_0"
// creates trigger file in temporary directory
val triggerFile: File = new File(triggerFileName)
val isCreated: Boolean = triggerFile.createNewFile()
if (isCreated)
println("Trigger created: " + triggerFileName)
else
println("Error in creating trigger file: " + triggerFileName)
CODE pour FileTrigger (tâche cron d'un intervalle de 5 minutes) -
val actualPath : String = "Original file directory here"
val tempPath : String = "Trigger file directory here"
val folder : File = new File(tempPath)
val listOfFiles = folder.listFiles()
for (i <- listOfFiles)
{
// ActualFileName_LastModifiedTime_NumberOfTries
val triggerFileName: String = i.getName
val triggerFilePath: String = i.toString
// extracting file info from trigger file name
val fileInfo: Array[String] = triggerFileName.split("_", 3)
// 0 -> Original file name, 1 -> last modified time, 2 -> number of tries
val actualFileName: String = fileInfo(0)
val actualFilePath: String = actualPath + actualFileName
val modifiedTime: Long = fileInfo(1).toLong
val numberOfTries: Int = fileStats(2).toInt
val currentModifiedTime: Long = Files.getLastModifiedTime(Paths.get(actualFilePath)).toMillis
val differenceInModifiedTimes: Long = currentModifiedTime - modifiedTime
// checks if file has been copied completely(4 intervals of 5 mins each with no modification)
if (differenceInModifiedTimes == 0 && numberOfTries == 3)
{
FileUtils.deleteQuietly(new File(triggerFilePath))
println("Trigger file deleted. Original file completed : " + actualFilePath)
}
else
{
var newTriggerFileName: String = null
if (differenceInModifiedTimes == 0)
{
// updates numberOfTries by 1
newTriggerFileName = actualFileName + "_" + modifiedTime + "_" + (numberOfTries + 1)
}
else
{
// updates modified timestamp and resets numberOfTries to 0
newTriggerFileName = actualFileName + "_" + currentModifiedTime + "_" + 0
}
// renames trigger file
new File(triggerFilePath).renameTo(new File(tempPath + newTriggerFileName))
println("Trigger file renamed: " + triggerFileName + " -> " + newTriggerFileName)
}
}