public Stream Open(string filename, FileMode fileMode, FileAccess fileAccess) { Stream result; IPseudoFile pseudoFile; bool fileExists = pseudoFiles.TryGetValue(filename, out pseudoFile); bool wantsWritable = (fileAccess & FileAccess.Write) != 0; switch (fileMode) { case FileMode.Append: if (fileExists) { if (wantsWritable && !pseudoFile.CanWrite) { throw new Exception("'File' is read-only"); } result = pseudoFile.Open(SeekOrigin.End); } else { throw new Exception("'File' doesn't exist"); } break; case FileMode.Create: if (fileExists) { if (wantsWritable && !pseudoFile.CanWrite) { throw new Exception("'File' is read-only"); } result = pseudoFile.Open(SeekOrigin.Begin); } else { pseudoFile = new PseudoFile(filename); pseudoFiles.Add(filename, pseudoFile); result = pseudoFile.Open(SeekOrigin.Begin); } break; case FileMode.CreateNew: if (fileExists) { throw new Exception("'File' exists"); } else { pseudoFile = new PseudoFile(filename); pseudoFiles.Add(filename, pseudoFile); result = pseudoFile.Open(SeekOrigin.Begin); } break; case FileMode.Open: if (fileExists) { if (wantsWritable && !pseudoFile.CanWrite) { throw new Exception("'File' is read-only"); } result = pseudoFile.Open(SeekOrigin.Begin); } else { throw new Exception("'File' doesn't exist"); } break; case FileMode.OpenOrCreate: if (fileExists) { if (wantsWritable && !pseudoFile.CanWrite) { throw new Exception("'File' is read-only"); } result = pseudoFile.Open(SeekOrigin.Begin); } else { pseudoFile = new PseudoFile(filename); pseudoFiles.Add(filename, pseudoFile); result = pseudoFile.Open(SeekOrigin.Begin); } break; case FileMode.Truncate: if (fileExists) { pseudoFile.Delete(); pseudoFile = new PseudoFile(filename); pseudoFiles[filename] = pseudoFile; result = pseudoFile.Open(SeekOrigin.Begin); } else { throw new Exception("'File' doesn't exist"); } break; default: throw new Exception("Unexpected FileMode"); } return(result); }
/// <summary> /// Adds a readonly pseudo file. /// </summary> public void AddPseudoFile(string filename, byte[] bytes) { IPseudoFile pseudoFile = new PseudoFile(filename, bytes); pseudoFiles.Add(filename, pseudoFile); }