public bool WriteAsFileSystem(string pw, List <FileInfo> files)
        {
            var encoder   = new UnicodeEncoding();
            var fileInfos = new List <FileInfo>();

            var startPage = DATA_START_ADDR;

            foreach (var f in files)
            {
                f.StartPage = startPage;
                fileInfos.Add(f);
                startPage += f.GetBlockPage();
            }

            var fatBuffer = SerializeMetadata(fileInfos);

            if (WriteAll(FAT_START_ADDR, PublicEncryptor.C(pw, fatBuffer).ToList())) // Write the FAT 2 page = 512 byte
            {
                foreach (var f in files)
                {
                    if (WriteAll(f.StartPage, PublicEncryptor.C(pw, f.GetBufferInMutipleOfPage().ToArray()).ToList()))
                    {
                    }
                }
            }
            return(true);
        }
        public Dictionary <string, FileInfo> ReadFileSystem(string pw, bool loadFiles = true, params string [] fileToLoads)
        {
            var fileToLoads2 = fileToLoads.ToList().ConvertAll(d => d.ToLower());
            var files        = new Dictionary <string, FileInfo>();
            var encoder      = new UnicodeEncoding();
            var r            = base.ReadPage(0, FAT_END_ADDR); // Read FAT 2 pages
            var fileInfos    = DeSerializeMetadata(PublicEncryptor.DC(pw, r.Buffer));

            if (fileInfos == null)
            {
                return(null);
            }

            var addr = this.DATA_START_ADDR;

            for (int i = 0; i < fileInfos.Count; i++)
            {
                var fi = fileInfos[i];
                if (loadFiles || fileToLoads2.Contains(fi.FileName.ToLowerInvariant()))
                {
                    var rr = base.ReadPage(fi.StartPage, BinSerializer.ComputeFileSizePerSector(fi.Length, PAGE_SIZE));
                    if (rr.Succeeded)
                    {
                        var b = PublicEncryptor.DC(pw, rr.Buffer).ToList();
                        fi.Buffer = b.Take(fi.Length).ToArray();
                    }
                    else
                    {
                        throw new ApplicationException(string.Format("Cannot read data file content '{0}'", fi.FileName));
                    }
                }
                files.Add(fi.FileName, fi);
            }
            return(files);
        }
        public bool WriteAsFileSystem()
        {
            var encoder    = new UnicodeEncoding();
            var fatBuffer  = SerializeFAT();
            var errorCount = 0;

            foreach (var f in FileInfos)
            {
                if (f.Dirty)
                {
                    if (WriteAll(f.StartPage, PublicEncryptor.C(this._pw, f.GetBufferInMutipleOfPage().ToArray()).ToList()))
                    {
                        f.Dirty = false;
                    }
                    else
                    {
                        errorCount++;
                    }
                }
            }
            if (errorCount == 0)
            {
                if (WriteAll(FAT_START_ADDR, PublicEncryptor.C(this._pw, fatBuffer).ToList())) // Write the FAT 2 page = 512 byte
                {
                    return(true);
                }
                else
                {
                    return(false);
                }
            }
            return(false);
        }
        public bool ReadFileSystem()
        {
            var encoder = new UnicodeEncoding();

            // Read the FAT
            var r = base.ReadPage(0, FAT_END_ADDR);

            FileInfos = DeSerializeFAT(PublicEncryptor.DC(this._pw, r.Buffer));
            return(FileInfos != null);
        }
        public bool ReadFileSystem()
        {
            var encoder = new UnicodeEncoding();
            var r       = GetFATWriterReader().LoadFAT(0, FAT_START_ADDR, FAT_END_ADDR);

            if (r == null)
            {
                return(false);
            }
            this.FileInfos = DeSerializeFAT(PublicEncryptor.DC(this._pw, r));
            return(FileInfos != null);
        }
        public sFsFileInfo LoadFileContent(sFsFileInfo fi)
        {
            var rr = base.ReadPage(fi.StartPage, BinSerializer.ComputeFileSizePerSector(fi.Length, PAGE_SIZE));

            if (rr.Succeeded)
            {
                fi.Buffer = PublicEncryptor.DC(this._pw, rr.Buffer);
                return(fi);
            }
            else
            {
                throw new ApplicationException(string.Format("Cannot read data file content '{0}'", fi.FileName));
            }
        }
        public sFsFileInfo LoadFileContent(sFsFileInfo fi)
        {
            var rr = GetFATWriterReader().ReadFile(fi.StartAddr, (uint)BinSerializer.ComputeFileSizePerSector(fi.Length, (int)GetFATWriterReader().SectorSize));

            if (rr != null)
            {
                fi.Buffer = PublicEncryptor.DC(this._pw, rr).Take(fi.Length).ToArray();
                return(fi);
            }
            else
            {
                throw new ApplicationException(string.Format("Cannot read data file content '{0}'", fi.FileName));
            }
        }