public override int GetFileFlags(DirectoryEntry entry) { int flags = 0; if (entry.StartSector > 719 && entry.EntryInUse) flags |= 0x1; if (entry.CreatedInDos2) flags |= 0x2; if (entry.Locked) flags |= 0x20; if (entry.EntryInUse && entry.StartSector < 720) flags |= 0x40; if (entry.Deleted) flags |= 0x80; return flags; }
public abstract int GetFileFlags(DirectoryEntry entry);
public override void SetFileFlags(DirectoryEntry entry, int flags) { if ((flags & 0x01) > 0 || (flags & 0x40) > 0) entry.EntryInUse = true; if ((flags & 0x2) > 0) entry.CreatedInDos2 = true; if ((flags & 0x20) > 0) entry.Locked = true; if ((flags & 0x80) > 0) entry.Deleted = true; }
public override int GetFileFlags(DirectoryEntry entry) { return 0; }
public abstract void SetFileFlags(DirectoryEntry entry, int flags);
public override int GetFileFlags(DirectoryEntry entry) { int flags = 0; if (entry.OpenForOutput) flags |= 0x1; if (entry.CreatedInDos2) flags |= 0x2; if (entry.Locked) flags |= 0x20; if (entry.EntryInUse) flags |= 0x40; if (entry.Deleted) flags |= 0x80; return flags; }
public override void SetFileFlags(DirectoryEntry entry, int flags) { throw new System.NotImplementedException(); }
/// <summary> /// Adds a directory entry /// </summary> /// <param name="entry"></param> public void AddEntry(DirectoryEntry entry) { entries.Add(entry); }
/// ----------------------------------------------------------------------------- /// <summary> /// Writes a directory entry back to the disk /// </summary> /// <param name="entry">Directory entry to write</param> /// <remarks> /// </remarks> /// ----------------------------------------------------------------------------- protected void WriteDirectoryEntry(DirectoryEntry entry) { byte[] sec; int i; string filename; string ext; int sector, offset; DirectorySectorLocation(entry.FileNumber, out sector, out offset); sec = ReadSector(sector); // Write flags sec[offset] = (byte)GetFileFlags(entry); // Write location information sec[offset + 2] = (byte)(entry.NumSectors >> 8); sec[offset + 1] = (byte)(entry.NumSectors & 0xff); sec[offset + 4] = (byte)(entry.StartSector >> 8); sec[offset + 3] = (byte)(entry.StartSector & 0xff); //Split filename i = entry.FileName.IndexOf("."); if (i > -1) { filename = entry.FileName.Substring(0, i); ext = entry.FileName.Substring(i + 1); } else { filename = entry.FileName; ext = ""; } filename = filename.PadRight(8); ext = ext.PadRight(3); //Write filename StringToBytes(sec, filename, offset + 5); StringToBytes(sec, ext, offset + 13); WriteSector(sector, sec); }
/// <summary> /// Finds the next open directory entry and creates a new entry at /// that locaiton /// </summary> /// <returns>New DirectoryEntry object</returns> private DirectoryEntry GetOpenEntry() { //Try to find an already open entry foreach (DirectoryEntry ent in directory) { if (!ent.EntryInUse && ent.Deleted) return ent; } //Check if directory is full if (directory.Count == maxFiles) return null; //Create a new entry DirectoryEntry entry = new DirectoryEntry(); entry.FileNumber = directory.Count; directory.Add(entry); return entry; }
/// <summary> /// Read the directory from the disk /// </summary> public override void ReadDirectory() { int curSector = DirectoryStartSector; byte[] sec; int fileNumber = 0; directory = new List<DirectoryEntry>(); while ((curSector <= DirectoryEndSector)) { sec = ReadSector(curSector); int pos = 0; while ((pos < 128)) { DirectoryEntry entry = new DirectoryEntry(); // Get flags int flags = sec[pos]; SetFileFlags(entry, flags); if (!entry.EntryInUse && !entry.Deleted) return; //Assign filenumber entry.FileNumber = fileNumber; fileNumber += 1; //Get file location information entry.NumSectors = sec[pos + 2] * 256 + sec[pos + 1]; entry.StartSector = sec[pos + 4] * 256 + sec[pos + 3]; //Check location information if (entry.StartSector < 4 | (entry.StartSector > 359 & entry.StartSector < 369) | entry.StartSector > LastUsableSector) { entry.ValidEntry = false; entry.ErrorList.Add(DirectoryEntry.EntryError.InvalidStartSector); } if (entry.NumSectors < 1 | entry.NumSectors > AvailableSectors()) { entry.ValidEntry = false; entry.ErrorList.Add(DirectoryEntry.EntryError.InvalidNumberOfSectors); } //Check filename if (sec[pos + 5] < 65 | sec[pos + 5] > 90) { entry.ValidEntry = false; entry.ErrorList.Add(DirectoryEntry.EntryError.FileNameInvalidCharacters); } for (int i = 6; i <= 15; i++) { if (!ValidFileNameCharacter((char)(sec[pos + i]))) { entry.ValidEntry = false; entry.ErrorList.Add(DirectoryEntry.EntryError.FileNameInvalidCharacters); break; } } //Get filename entry.FileName = BytesToString(sec, pos + 5, pos + 12).Trim(); string extension = BytesToString(sec, pos + 13, pos + 15).Trim(); if (extension != "") entry.FileName += "." + extension; //Add entry directory.Add(entry); pos += 16; } curSector += 1; } }
/// <summary> /// Read the directory from the disk /// </summary> public override void DumpDirectory() { int curSector = DirectoryStartSector; byte[] sec; int fileNumber = 0; while ((curSector <= DirectoryEndSector)) { sec = ReadSector(curSector); int pos = 0; while ((pos < 128)) { DirectoryEntry entry = new DirectoryEntry(); // Get flags int flags = sec[pos]; SetFileFlags(entry, flags); //Assign filenumber entry.FileNumber = fileNumber; fileNumber += 1; //Get file location information entry.NumSectors = sec[pos + 2] * 256 + sec[pos + 1]; entry.StartSector = sec[pos + 4] * 256 + sec[pos + 3]; //Get filename entry.FileName = BytesToString(sec, pos + 5, pos + 12).Trim(); string extension = BytesToString(sec, pos + 13, pos + 15).Trim(); if (extension != "") entry.FileName += "." + extension; pos += 16; System.Diagnostics.Debug.WriteLine(string.Format("{0}: {1}, In Use: {2}, Delete: {3}, Dos2: {4}",entry.FileNumber, entry.FileName.ToString(), entry.EntryInUse, entry.Deleted, entry.CreatedInDos2)); } curSector += 1; } }