예제 #1
0
        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);
        }
예제 #2
0
        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);
        }
예제 #3
0
        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);
        }
예제 #4
0
        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);
        }
예제 #5
0
        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");
                    }
                }
            }
        }
예제 #6
0
        public static bool WriteFile(MFSDisk mfsDisk, byte[] filedata, string filepath)
        {
            MFSDirectory _dir = GetDirectoryFromPath(mfsDisk, filepath);

            return(WriteFile(mfsDisk, filedata, Path.GetFileName(filepath), _dir.DirectoryID));
        }
예제 #7
0
        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);
        }