예제 #1
0
        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)));
        }