ne pas être en mesure de convertir de FILETIME (windows temps) de type dateTime ( j'ai une date différente )
La plupart des fichiers que j'ai lu d'obtenir le droit de temps lorsque vous utilisez la méthode suivante pour convertir:
//works great most of the time
private static DateTime convertToDateTime(System.Runtime.InteropServices.ComTypes.FILETIME time)
{
long highBits = time.dwHighDateTime;
highBits = highBits << 32;
return DateTime.FromFileTimeUtc(highBits + time.dwLowDateTime);
}
Ici, j'ai un exemple dans visual studio pour montrer comment cette méthode ne fonctionne pas pour l'exemple, je vais vous montrer la taille réelle du fichier dans mon ordinateur et le débogage. Ainsi, le fichier qui se trouve être dans mon debug:
"A:\Users\Tono\Documents\Visual Studio 2010\Projects\WpfApplication4\WpfApplication4\obj\x86\Debug\App.g.cs"
Et voici le FILETIME que je suis en train de convertir DateTime "j'ai besoin de la LastWriteTime par la voie"
Ici, vous pouvez voir que dwHighDateTime = 30136437 et aussi que dwLowDateTime = -2138979250 à partir de ce fichier.
Et quand je lance ma méthode, en plus d'autres techniques je obtenir les dates suivantes:
Donc, jusqu'à présent, tout semble fonctionner parfaitement. Mais pourquoi est-ce que quand je de parcourir et de rechercher ce fichier spécifique dans windows je reçois une autre date !? Ici est la date que je reçois quand voir les propriétés du fichier:
Pourquoi les dates ne correspondent pas? Ce que je fais mal?
Je ne sais pas pourquoi l'OP c'est ce que fait à la dure. Lorsque vous travaillez avec de longs noms de chemin d'accès, c'est à des chemins de plus de [MAX_LENGTH] = 260 octets, vous devez pour réécrire la plupart de Système.IO utiliser du code non managé. Il n'y a plus d'infos à être trouvé ici: blogs.msdn.com/b/bclteam/archive/2007/02/13/...
Il est légitime de scénarios d'utilisation FILETIME / GetFileTime au lieu de FileInfo: Par exemple, si vous souhaitez obtenir des statistiques sur un fichier dont la poignée que vous avez déjà ouvertes (et ne peut pas ré-ouvrir via FileInfo pour une certaine raison)
OriginalL'auteur Tono Nam | 2011-05-21
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin de combiner les LS et les valeurs de MS au niveau du bit, pas de manière arithmétique.
Essayer:
Ou l'une des suivantes doivent travailler trop:
Vous pouvez vous en sortir avec l'ajout plutôt que d'un bit à bit ou si vous êtes sûr que les valeurs sont positives (et n'ont pas de bits en commun). Mais au niveau du bit-ou exprime l'intention de mieux.
(long)((uint)(time.dwLowDateTime))
ou de corriger le interop si il commence comme un uint.fatigué, mais ne fonctionne pas. Je pense que ma méthode est celle qui est la lecture de la mauvaise date. Je vais continuer à essayer de le comprendre.
OriginalL'auteur Joe
Je suis un peu en retard à la fête, mais cela a fonctionné de manière fiable pour moi:
Note: Ne faites pas confiance à l'Explorateur Windows. Utilisation Fichier.GetLastWriteTimeUtc méthode, par exemple, pour vérifier que le système de fichiers en fait a l'encontre de ce que cette extension de la méthode retourne. Explorer a quelques bugs qui ne sont pas de fichier de mise à jour des temps dans certaines situations. Cheers! 🙂
Note: Pour tester cela, vous devez utiliser les valeurs maximales. Donc, en supposant
dwHighDateTime = dwLowDateTime = UInt32.MaxValue = 4294967295 = 0xFFFFFFFF
, il s'ensuit que(long)(((ulong)UInt32.MaxValue << 32) + UInt32.MaxValue) = -1 = 0xFFFFFFFFFFFFFFFF
. Malheureusement, l'erreur de l'API Windows semble être que, finalement, le temps a besoin d'être castée pour unlong
valeur afin de travailler avec elle pour toutes les applications utiles (puisque la plupart des Windows méthodes de l'API de prendre le temps de fichier comme unlong
valeur), ce qui signifie que, une fois le premier bit est élevé (1
) surdwHighDateTime
, la valeur devient négative. Permet d'essayer avec le maximum de temps de ne pas être élevé. En supposant quedwHighDateTime = Int32.MaxValue = 2147483647 = 0x7FFFFFFF
etdwLowDateTime = UInt32.MaxValue = 4294967295 = 0xFFFFFFFF
, il s'ensuit que(long)(((ulong)Int32.MaxValue << 32) + UInt32.MaxValue) = 0x7FFFFFFFFFFFFFFF
.Note:
0x7FFFFFFFFFFFFFFF
est déjà beaucoup plus grande queDateTime.MaxValue.ToFileTimeUtc() = 2650467743999999999 = 0x24C85A5ED1C04000
, le rendu des numéros de grande déjà inutile pour des applications pratiques .NET.C'est parce que les autres réponses ne sont pas comptabilisés dans les hautes date composant comme un entier non signé de 64 bits de la valeur...à la place je vois qu'ils incorrectement jeté à l'un signé de 64 bits de valeur, qui peut retourner un résultat négatif, ce qui est incorrect.
En effet, ce qui semble être la plus précise de la solution.
OriginalL'auteur Alexandru
C'est une autre méthode que j'ai vu à la convertir en une structure FileTime à une longue (à l'aide d'un code de l'opérateur dans la structure), qui peut ensuite être facilement convertis en DateTime à l'aide de l'DateTime.FromFileTime fonctions:
OriginalL'auteur mkisaacs
J'ai essayé ce qui suit, et non de m'avoir le droit de temps:
Et j'ai eu la méthode de ici
OriginalL'auteur Tono Nam
dwLowDateTime
etdwHighDateTime
devrait êtreuint
et on dirait qu'ils sontint
. Changer ce sera probablement bien fixer comme @Joe a souligné, vous devriez toujours utiliser|
au lieu de+
.OriginalL'auteur Yaur