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);
        }