public static bool WriteFile(MFSDisk mfsDisk, byte[] filedata, MFSFile file) { if (CheckIfFileAlreadyExists(mfsDisk, file.Name, file.Ext, file.ParentDirectory)) { return(false); } if (GetFreeSpaceSize(mfsDisk) < filedata.Length) { return(false); } int FATentry = -1; int lastFATentry = -1; int offset = 0; for (int i = 6; i < Leo.SIZE_LBA - Leo.RamStartLBA[mfsDisk.RAMVolume.DiskType]; i++) { if (mfsDisk.RAMVolume.FAT[i] == (ushort)MFS.FAT.Unused) { if (FATentry == -1) { FATentry = i; file.FATEntry = (ushort)i; } //Write File Data Array.Copy(filedata, offset, mfsDisk.Data, mfsDisk.OffsetToMFSRAM + Leo.LBAToByte(mfsDisk.RAMVolume.DiskType, Leo.RamStartLBA[mfsDisk.RAMVolume.DiskType], i), Math.Min(Leo.LBAToByte(mfsDisk.RAMVolume.DiskType, Leo.RamStartLBA[mfsDisk.RAMVolume.DiskType] + i, 1), filedata.Length - offset)); offset += Math.Min(Leo.LBAToByte(mfsDisk.RAMVolume.DiskType, Leo.RamStartLBA[mfsDisk.RAMVolume.DiskType] + i, 1), filedata.Length - offset); if (lastFATentry != -1) { mfsDisk.RAMVolume.FAT[lastFATentry] = (ushort)i; } if (offset == filedata.Length) { mfsDisk.RAMVolume.FAT[i] = (ushort)MFS.FAT.LastFileBlock; mfsDisk.RAMVolume.Entries.Add(file); return(true); } lastFATentry = i; } } return(false); }
public static int GetCapacitySize(MFSDisk mfsDisk) { int totalsize = 0; for (int i = 6; i < Leo.SIZE_LBA - Leo.RamStartLBA[mfsDisk.RAMVolume.DiskType]; i++) { switch (mfsDisk.RAMVolume.FAT[i]) { case (ushort)MFS.FAT.Prohibited: case (ushort)MFS.FAT.DontManage: break; default: totalsize += Leo.LBAToByte(mfsDisk.RAMVolume.DiskType, Leo.RamStartLBA[mfsDisk.RAMVolume.DiskType] + i, 1); break; } } return(totalsize); }
public static bool DeleteFile(MFSDisk mfsDisk, MFSFile file) { //Delete FAT Entries ushort nextblock = file.FATEntry; ushort lastblock = 0; do { lastblock = nextblock; nextblock = mfsDisk.RAMVolume.FAT[nextblock]; mfsDisk.RAMVolume.FAT[lastblock] = 0; }while (nextblock != (ushort)MFS.FAT.LastFileBlock); //Delete File Data if (mfsDisk.RAMVolume.Entries.Remove(file)) { Console.WriteLine("found"); } return(true); }
public static byte[] ReadFile(MFSDisk mfsDisk, MFSFile file) { byte[] filedata = new byte[file.Size]; //Add FAT Entries and Copy to data to blocks ushort nextblock = file.FATEntry; uint offset = 0; uint size = file.Size; do { int blocksrc = Leo.LBAToByte(mfsDisk.RAMVolume.DiskType, Leo.RamStartLBA[mfsDisk.RAMVolume.DiskType], nextblock); int blocksize = Leo.LBAToByte(mfsDisk.RAMVolume.DiskType, Leo.RamStartLBA[mfsDisk.RAMVolume.DiskType] + nextblock, 1); Array.Copy(mfsDisk.Data, mfsDisk.OffsetToMFSRAM + blocksrc, filedata, offset, Math.Min(blocksize, size)); offset += (uint)Math.Min(blocksize, size); size -= (uint)Math.Min(blocksize, size); nextblock = mfsDisk.RAMVolume.FAT[nextblock]; }while (nextblock != (ushort)MFS.FAT.LastFileBlock); return(filedata); }
static void Main(string[] args) { Console.OutputEncoding = Encoding.Unicode; Console.WriteLine("64DD MFS Manager - by LuigiBlood"); if (args.Length < 2) { Console.WriteLine("Usage: mfs_manager <RAM file> <options>"); Console.WriteLine("<options> can be the following:"); Console.WriteLine(" -d : List all directories with their IDs"); Console.WriteLine(" -f : List all files"); Console.WriteLine(" -e : Extract all files"); Console.WriteLine(" -e <File Path> : Extract specified file (must start with \"/\")"); Console.WriteLine(" -i <File> <Directory Path/ID> : Insert <File> into <Directory Path/ID> (Path must start AND end with \"/\")"); Console.WriteLine(" -r <File Path> : Delete <File> (Path must start with \"/\")"); Console.WriteLine(" -m <File Path> <Dir/File Path>: Move <File> to <Directory> AND/OR rename if <File Path> (Path must start with \"/\")"); } else if (args.Length >= 2) { MFSDisk mfsDisk = new MFSDisk(args[0]); if (mfsDisk.Format == MFS.DiskFormat.Invalid) { Console.WriteLine("Error loading RAM file"); return; } if (args[1].Equals("-d")) { //Directory List Console.WriteLine("Directory List:"); foreach (MFSEntry entry in mfsDisk.RAMVolume.Entries) { if (entry.GetType() == typeof(MFSDirectory)) { Console.WriteLine(((MFSDirectory)entry).DirectoryID + ": " + MFSRAMUtil.GetFullPath(mfsDisk, entry));// + " (" + ((MFSDirectory)entry).CheckShiftJIS() + ")"); } } } else if (args[1].Equals("-f")) { //File List Console.WriteLine("File List:"); foreach (MFSEntry entry in mfsDisk.RAMVolume.Entries) { if (entry.GetType() == typeof(MFSFile)) { Console.WriteLine(MFSRAMUtil.GetFullPath(mfsDisk, entry)); } } } else if (args[1].Equals("-e")) { //Extract if (args.Length > 2) { Console.WriteLine("Extract " + args[2]); byte[] data = MFSRAMUtil.ReadFile(mfsDisk, args[2]); if (data != null) { FileStream fileExt = new FileStream(".\\extract\\" + Path.GetFileName(args[2]), FileMode.Create); fileExt.Write(data, 0, data.Length); fileExt.Close(); Console.WriteLine("Done"); } else { Console.WriteLine("Error"); } } else { foreach (MFSEntry entry in mfsDisk.RAMVolume.Entries) { if (entry.GetType() == typeof(MFSFile)) { Console.WriteLine("Extract " + MFSRAMUtil.GetFullPath(mfsDisk, entry)); byte[] data = MFSRAMUtil.ReadFile(mfsDisk, (MFSFile)entry); FileStream fileExt = new FileStream(".\\extract\\" + entry.Name + (((MFSFile)entry).Ext != "" ? "." : "") + ((MFSFile)entry).Ext, FileMode.Create); fileExt.Write(data, 0, data.Length); fileExt.Close(); } } } } else if (args[1].Equals("-i") && args.Length > 3) { //Insert File FileStream testAdd = new FileStream(args[2], FileMode.Open); byte[] testArray = new byte[testAdd.Length]; testAdd.Read(testArray, 0, (int)testAdd.Length); testAdd.Close(); bool file = false; if (args[3].StartsWith("/") && args[3].EndsWith("/")) { file = MFSRAMUtil.WriteFile(mfsDisk, testArray, args[3] + Path.GetFileName(args[2])); } else if (Regex.IsMatch(args[3], "^\\d+$")) { file = MFSRAMUtil.WriteFile(mfsDisk, testArray, Path.GetFileName(args[2]), ushort.Parse(args[3])); } if (!file) { Console.WriteLine("Could not insert file"); } else { Console.WriteLine("File " + Path.GetFileName(args[2]) + " inserted successfully"); } mfsDisk.Save(args[0] + ".new.ram"); } else if (args[1].Equals("-r")) { //Delete (-r emove) if (args.Length > 2) { Console.WriteLine("Delete " + args[2]); if (MFSRAMUtil.DeleteFile(mfsDisk, args[2])) { Console.WriteLine("Done"); mfsDisk.Save(args[0] + ".new.ram"); } else { Console.WriteLine("Error"); } } } else if (args[1].Equals("-m") && args.Length > 3) { //Insert File if (MFSRAMUtil.MoveFile(mfsDisk, args[2], args[3])) { Console.WriteLine("Done"); mfsDisk.Save(args[0] + ".new.ram"); } else { Console.WriteLine("File was not moved/renamed successfully"); } } } }
public static bool WriteFile(MFSDisk mfsDisk, byte[] filedata, string filepath) { MFSDirectory _dir = GetDirectoryFromPath(mfsDisk, filepath); return(WriteFile(mfsDisk, filedata, Path.GetFileName(filepath), _dir.DirectoryID)); }
public static int GetFreeSpaceSize(MFSDisk mfsDisk) { int unused = Leo.RamSize[mfsDisk.RAMVolume.DiskType] - GetTotalUsedSize(mfsDisk) - Leo.LBAToByte(mfsDisk.RAMVolume.DiskType, Leo.RamStartLBA[mfsDisk.RAMVolume.DiskType], 6); return(unused); }