mirror of
https://github.com/aaru-dps/Aaru.git
synced 2025-12-16 19:24:25 +00:00
Implement Read() in FAT.
This commit is contained in:
@@ -32,8 +32,10 @@
|
|||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using DiscImageChef.CommonTypes.Structs;
|
using DiscImageChef.CommonTypes.Structs;
|
||||||
|
using FileAttributes = DiscImageChef.CommonTypes.Structs.FileAttributes;
|
||||||
|
|
||||||
namespace DiscImageChef.Filesystems.FAT
|
namespace DiscImageChef.Filesystems.FAT
|
||||||
{
|
{
|
||||||
@@ -77,7 +79,41 @@ namespace DiscImageChef.Filesystems.FAT
|
|||||||
{
|
{
|
||||||
if(!mounted) return Errno.AccessDenied;
|
if(!mounted) return Errno.AccessDenied;
|
||||||
|
|
||||||
throw new NotImplementedException();
|
Errno err = Stat(path, out FileEntryInfo stat);
|
||||||
|
|
||||||
|
if(err != Errno.NoError) return err;
|
||||||
|
|
||||||
|
if(stat.Attributes.HasFlag(FileAttributes.Directory) && !debug) return Errno.IsDirectory;
|
||||||
|
|
||||||
|
if(offset >= stat.Length) return Errno.InvalidArgument;
|
||||||
|
|
||||||
|
if(size + offset >= stat.Length) size = stat.Length - offset;
|
||||||
|
|
||||||
|
uint[] clusters = GetClusters((uint)stat.Inode);
|
||||||
|
|
||||||
|
long firstCluster = offset / bytesPerCluster;
|
||||||
|
long offsetInCluster = offset % bytesPerCluster;
|
||||||
|
long sizeInClusters = (size + offsetInCluster) / bytesPerCluster;
|
||||||
|
if((size + offsetInCluster) % bytesPerCluster > 0) sizeInClusters++;
|
||||||
|
|
||||||
|
MemoryStream ms = new MemoryStream();
|
||||||
|
|
||||||
|
for(int i = 0; i < sizeInClusters; i++)
|
||||||
|
{
|
||||||
|
if(i + firstCluster >= clusters.Length) return Errno.InvalidArgument;
|
||||||
|
|
||||||
|
byte[] buffer =
|
||||||
|
image.ReadSectors(firstClusterSector + (clusters[i + firstCluster] - 2) * sectorsPerCluster,
|
||||||
|
sectorsPerCluster);
|
||||||
|
|
||||||
|
ms.Write(buffer, 0, buffer.Length);
|
||||||
|
}
|
||||||
|
|
||||||
|
ms.Position = offsetInCluster;
|
||||||
|
buf = new byte[size];
|
||||||
|
ms.Read(buf, 0, (int)size);
|
||||||
|
|
||||||
|
return Errno.NoError;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Errno Stat(string path, out FileEntryInfo stat)
|
public Errno Stat(string path, out FileEntryInfo stat)
|
||||||
|
|||||||
Reference in New Issue
Block a user