Fix Xbox 360 FAT date conversion.

This commit is contained in:
2019-04-15 22:00:54 +01:00
parent adbea375c4
commit a144b7f9c3
2 changed files with 54 additions and 47 deletions

View File

@@ -145,20 +145,28 @@ namespace DiscImageChef.Filesystems.FATX
stat = new FileEntryInfo stat = new FileEntryInfo
{ {
Attributes = new FileAttributes(), Attributes = new FileAttributes(),
Blocks = entry.length / bytesPerCluster, Blocks = entry.length / bytesPerCluster,
BlockSize = bytesPerCluster, BlockSize = bytesPerCluster,
DeviceNo = 0, DeviceNo = 0,
GID = 0, GID = 0,
Length = entry.length, Length = entry.length,
Inode = entry.firstCluster, Inode = entry.firstCluster,
Links = 1, Links = 1,
Mode = (uint)(entry.attributes.HasFlag(Attributes.Directory) ? 0x16D : 0x124), Mode = (uint)(entry.attributes.HasFlag(Attributes.Directory) ? 0x16D : 0x124),
UID = 0, UID = 0,
CreationTime = DateHandlers.DosToDateTime(entry.creationDate, entry.creationTime).AddYears(20), CreationTime =
AccessTime = DateHandlers.DosToDateTime(entry.lastAccessDate, entry.lastAccessTime).AddYears(20), littleEndian
LastWriteTime = DateHandlers.DosToDateTime(entry.lastWrittenDate, entry.lastWrittenTime) ? DateHandlers.DosToDateTime(entry.creationDate, entry.creationTime).AddYears(20)
.AddYears(20) : DateHandlers.DosToDateTime(entry.creationTime, entry.creationDate),
AccessTime =
littleEndian
? DateHandlers.DosToDateTime(entry.lastAccessDate, entry.lastAccessTime).AddYears(20)
: DateHandlers.DosToDateTime(entry.lastAccessTime, entry.lastAccessDate),
LastWriteTime = littleEndian
? DateHandlers
.DosToDateTime(entry.lastWrittenDate, entry.lastWrittenTime).AddYears(20)
: DateHandlers.DosToDateTime(entry.lastWrittenTime, entry.lastWrittenDate)
}; };
if(entry.length % bytesPerCluster > 0) stat.Blocks++; if(entry.length % bytesPerCluster > 0) stat.Blocks++;

View File

@@ -359,48 +359,47 @@ namespace DiscImageChef.Tests.Filesystems
Assert.AreEqual(Errno.InvalidArgument, error); Assert.AreEqual(Errno.InvalidArgument, error);
} }
// TODO: The dates look incorrect
[Test] [Test]
public void Stat() public void Stat()
{ {
Errno error = fs.Stat("Content/0000000000000000/FFFE07DF/00040000", out FileEntryInfo stat); Errno error = fs.Stat("Content/0000000000000000/FFFE07DF/00040000", out FileEntryInfo stat);
Assert.AreEqual(Errno.NoError, error); Assert.AreEqual(Errno.NoError, error);
Assert.AreEqual(new DateTime(2055, 1, 23, 8, 25, 50, DateTimeKind.Utc), stat.AccessTimeUtc); Assert.AreEqual(new DateTime(2013, 9, 25, 12, 49, 46, DateTimeKind.Utc), stat.AccessTimeUtc);
Assert.AreEqual(FileAttributes.Directory, stat.Attributes); Assert.AreEqual(FileAttributes.Directory, stat.Attributes);
Assert.AreEqual(DateTime.MinValue, stat.BackupTimeUtc); Assert.AreEqual(DateTime.MinValue, stat.BackupTimeUtc);
Assert.AreEqual(1, stat.Blocks); Assert.AreEqual(1, stat.Blocks);
Assert.AreEqual(16384, stat.BlockSize); Assert.AreEqual(16384, stat.BlockSize);
Assert.AreEqual(new DateTime(2055, 1, 23, 8, 25, 50, DateTimeKind.Utc), stat.CreationTimeUtc); Assert.AreEqual(new DateTime(2013, 9, 25, 12, 49, 46, DateTimeKind.Utc), stat.CreationTimeUtc);
Assert.AreEqual(0, stat.DeviceNo); Assert.AreEqual(0, stat.DeviceNo);
Assert.AreEqual(0, stat.GID); Assert.AreEqual(0, stat.GID);
Assert.AreEqual(12, stat.Inode); Assert.AreEqual(12, stat.Inode);
Assert.AreEqual(new DateTime(2055, 1, 23, 8, 25, 50, DateTimeKind.Utc), stat.LastWriteTimeUtc); Assert.AreEqual(new DateTime(2013, 9, 25, 12, 49, 46, DateTimeKind.Utc), stat.LastWriteTimeUtc);
Assert.AreEqual(16384, stat.Length); Assert.AreEqual(16384, stat.Length);
Assert.AreEqual(1, stat.Links); Assert.AreEqual(1, stat.Links);
Assert.AreEqual(365, stat.Mode); Assert.AreEqual(365, stat.Mode);
Assert.AreEqual(DateTime.MinValue, stat.StatusChangeTimeUtc); Assert.AreEqual(DateTime.MinValue, stat.StatusChangeTimeUtc);
Assert.AreEqual(0, stat.UID); Assert.AreEqual(0, stat.UID);
error = fs.Stat("Content/0000000000000000/FFFE07DF/00040000/ContentCache", out stat); error = fs.Stat("Content/0000000000000000/FFFE07DF/00040000/ContentCache", out stat);
Assert.AreEqual(Errno.NoSuchFile, error); Assert.AreEqual(Errno.NoSuchFile, error);
error = fs.Stat("Content/0000000000000000/FFFE07DF/00040000/ContentCache.pkg", out stat); error = fs.Stat("Content/0000000000000000/FFFE07DF/00040000/ContentCache.pkg", out stat);
Assert.AreEqual(Errno.NoError, error); Assert.AreEqual(Errno.NoError, error);
Assert.AreEqual(new DateTime(2082, 2, 24, 9, 11, 36, DateTimeKind.Utc), stat.AccessTimeUtc); Assert.AreEqual(new DateTime(2016, 11, 18, 20, 34, 48, DateTimeKind.Utc), stat.AccessTimeUtc);
Assert.AreEqual(FileAttributes.None, stat.Attributes); Assert.AreEqual(FileAttributes.None, stat.Attributes);
Assert.AreEqual(DateTime.MinValue, stat.BackupTimeUtc); Assert.AreEqual(DateTime.MinValue, stat.BackupTimeUtc);
Assert.AreEqual(6, stat.Blocks); Assert.AreEqual(6, stat.Blocks);
Assert.AreEqual(16384, stat.BlockSize); Assert.AreEqual(16384, stat.BlockSize);
Assert.AreEqual(new DateTime(2082, 2, 24, 9, 11, 36, DateTimeKind.Utc), stat.CreationTimeUtc); Assert.AreEqual(new DateTime(2016, 11, 18, 20, 34, 48, DateTimeKind.Utc), stat.CreationTimeUtc);
Assert.AreEqual(0, stat.DeviceNo); Assert.AreEqual(0, stat.DeviceNo);
Assert.AreEqual(0, stat.GID); Assert.AreEqual(0, stat.GID);
Assert.AreEqual(18, stat.Inode); Assert.AreEqual(18, stat.Inode);
Assert.AreEqual(new DateTime(2082, 2, 24, 9, 11, 36, DateTimeKind.Utc), stat.LastWriteTimeUtc); Assert.AreEqual(new DateTime(2016, 11, 18, 20, 34, 48, DateTimeKind.Utc), stat.LastWriteTimeUtc);
Assert.AreEqual(86016, stat.Length); Assert.AreEqual(86016, stat.Length);
Assert.AreEqual(1, stat.Links); Assert.AreEqual(1, stat.Links);
Assert.AreEqual(292, stat.Mode); Assert.AreEqual(292, stat.Mode);
Assert.AreEqual(DateTime.MinValue, stat.StatusChangeTimeUtc); Assert.AreEqual(DateTime.MinValue, stat.StatusChangeTimeUtc);
Assert.AreEqual(0, stat.UID); Assert.AreEqual(0, stat.UID);
} }
[Test] [Test]