public static bool EnumFileSys(IEnumDir iterator) { DirRec dir = GetByPath("CD:ROOT"); return(EnumDir("CD:ROOT", dir, iterator)); }
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); }