static public StreamAdapterInfo Open(string filename) { filename = filename.ToLowerInvariant().Trim(); if (!File.Exists(filename)) { return(null); } if (filename.EndsWith(@".chd")) { return(new StreamAdapterInfo(CHD.Load(new FileStream(filename, FileMode.Open, FileAccess.Read)))); } if (filename.EndsWith(@".gz")) { var gz = new Gzip(filename); return(new StreamAdapterInfo(gz.GetDeflateStream(), 0x7FFFFFFFFFFFL)); // stupid value to play nice with arithmetic } if (filename.EndsWith(@".zip")) { var zip = new Zip(filename); if (zip.Files.Count > 0) { var file = zip.Files[0]; long length = file.UncompressedSize; if (length == 0 && file.CompressedSize != 0) { length = file.CompressedSize; } return(new StreamAdapterInfo(zip.StreamFile(file), length)); } } return(new StreamAdapterInfo(new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read))); }