Esempio n. 1
0
        public static bool EnumFileSys(IEnumDir iterator)
        {
            DirRec dir = GetByPath("CD:ROOT");

            return(EnumDir("CD:ROOT", dir, iterator));
        }
Esempio n. 2
0
        public static bool EnumDir(string url, DirRec dir, IEnumDir iterator)
        {
            int pos = dir.LbaData * 2048;
            int end = pos + dir.LenData;

            pos += RamDisk.GetU8(pos); // skip current directory
            pos += RamDisk.GetU8(pos); // skip parent directory
            while (pos < end)
            {
                byte len = RamDisk.GetU8(pos);
                if (len == 0)
                {
                    pos = ((pos / 2048) + 1) * 2048;
                }
                else
                {
                    string key = url + "/" + GetRecordFileName(pos);
                    DirRec rec = null;
                    if (Records.ContainsKey(key))
                    {
                        rec = Records[key];
                    }
                    else
                    {
                        rec = new DirRec(key, pos);
                        Model.SetPos(key, pos);
                        Model.SetLen(key, rec.LenData);
                        Model.SetRec(key, rec);
                        string name = rec.GetFileName();
                        int    lba  = rec.LbaData;
                        int    num  = (rec.LenData + 2047) / 2048;
                        if (rec.FileFlags_Directory)
                        {
                            for (int i = 0; i < num; i++)
                            {
                                RamDisk.Read(lba + i);
                            }
                        }
                        else
                        {
                            for (int i = 0; i < num; i++)
                            {
                                if (RamDisk.map[lba + i] == 0)
                                {
                                    RamDisk.map[lba + i] = 0x6F;
                                }
                            }
                        }
                        try {
                            Records.Add(key, rec);
                            Path2Pos.Add(key, rec.GetPos());
                            Lba2Path.Add(lba, key);
                            Publisher.Register(key, rec);
                        } catch (Exception e) {
                            Logger.Warn("Cannot register " + name + " " + e.Message);
                        }
                    }
                    if (rec.FileFlags_Directory)
                    {
                        int lba = rec.LbaData;
                        int num = (rec.LenData + 2047) / 2048;
                        for (int i = 0; i < num; i++)
                        {
                            RamDisk.Read(lba + i);
                        }

                        if (iterator != null)
                        {
                            iterator.Visit(key, rec);
                        }
                    }
                    pos += len;
                }
            }

            pos  = dir.LbaData * 2048;
            pos += RamDisk.GetU8(pos); // skip current directory
            pos += RamDisk.GetU8(pos); // skip parent directory
            while (pos < end)
            {
                byte len = RamDisk.GetU8(pos);
                if (len == 0)
                {
                    pos = ((pos / 2048) + 1) * 2048;
                }
                else
                {
                    string key = url + "/" + GetRecordFileName(pos);
                    DirRec rec = Records[key];
                    if (!rec.FileFlags_Directory)
                    {
                        if (iterator != null)
                        {
                            iterator.Visit(key, rec);
                        }
                    }
                    pos += len;
                }
            }
            return(true);
        }