file.lastModified () n'est jamais ce qui a été défini avec file.setLastModified ()
J'ai un problème avec millis définir et de lire sur Android 2.3.4 sur un Nexus One. C'est le code:
File fileFolder = new File(Environment.getExternalStorageDirectory(), appName + "/"
+ URLDecoder.decode(folder.getUrl()));
if (fileFolder != null && !fileFolder.exists()) {
fileFolder.setLastModified(1310198774);
fileFolder.mkdirs();
fileFolder.setLastModified(1310198774);
}
if (fileFolder != null && fileFolder.exists()) {
long l = fileFolder.lastModified();
}
Dans ce petit test que j'ai écris 1310198774 mais le résultat est retourné à partir de lastModified() est 1310199771000.
Même si j'ai coupé la fin "000" il y a une différence de plusieurs minutes.
J'ai besoin de synchroniser des fichiers entre un service et l'appareil Android. Le lastmodification millis font partie des données transmises par ce service. J'ai placé le millis à la création/copier des fichiers et des dossiers à vérifier si le fichier/dossier doit être remplacé.
Tout fonctionne MAIS le millis qui sont retournés à partir du système de fichiers sont différents des valeurs qui ont été définies.
Je suis assez sûr qu'il ya quelque chose de mal avec mon code mais je ne le trouve pas.
Merci beaucoup à l'avance.
HJW
source d'informationauteur Harald Wilhelm
Vous devez vous connecter pour publier un commentaire.
Alors peut-être que je manque quelque chose, mais je vois quelques problèmes avec votre code ci-dessus. Votre problème peut être dû (comme @JB mentionné) pour Android problèmes, mais pour la postérité, j'ai pensé que je voudrais vous donner une réponse.
Tout d'abord,
File.setLastModified()
prend le temps en millisecondes. Voici les la documentation javadoc. Vous semblez être d'essayer de mettre cela en quelques secondes. Ainsi, votre code doit être quelque chose comme:Comme mentionné dans la javadoc, de nombreux systèmes de fichiers uniquement en charge secondes de granularité pour la dernière date de modification. Donc, si vous avez besoin de voir la même date de modification dans un fichier, alors vous devriez faire quelque chose comme ce qui suit:
Sur Jelly Bean+, c'est différent (surtout sur les appareils Nexus, et d'autres qui utilisent le nouveau fusible de la couche de /mnt/shell/émulé sdcard émulation):
C'est un VFS problème de permission, le syscall utimensat() échoue avec EPERM dus à des autorisations (par exemple, la propriété).
dans la plate-forme/système/base/sdcard/sdcard.c:
De utimensat()'s syscall homme page:
Vieille GRAISSE offre une substitution de la iattr->indicateur valide via une option de montage pour permettre le changement de horodatages à personne, FUSIBLE+Android sdcard-FUSIBLE de ne pas le faire à l'instant (de sorte que le " inode_change_ok() échec de l'appel) et la tentative est rejetée avec -EPERM. Voici les GRAISSES ./fs/fat/fichier.c:
J'ai également ajouté cette info à ce bug ouvert.
Si tout cela ne fonctionne pas, essayez ceci (laid) solution de contournement cité de https://code.google.com/p/android/issues/detail?id=18624:
Travaille sur certains appareils, mais pas sur d'autres. Ne pas concevoir une solution qui s'appuie sur ce travail. Voir https://code.google.com/p/android/issues/detail?id=18624#c29
Voici un test simple pour voir si elle fonctionne.
Si vous voulez seulement changer la date/l'heure d'un répertoire à la date/heure actuelle (c'est à dire, "maintenant"), alors vous pouvez créer une sorte de fichier temporaire à l'intérieur de ce répertoire, écrire quelque chose en elle, puis supprimez-le immédiatement. Cela a pour effet de changer le " lastModified()' la date/heure de l'annuaire de la date/de l'heure. Cela ne fonctionne pas bien, si vous voulez changer le répertoire de la date/heure à une autre valeur aléatoire, et ne peut pas être appliqué à un fichier, évidemment.