コード例 #1
0
ファイル: CabUnpacker.cs プロジェクト: massreuy/3P
        internal override int CabOpenStreamEx(string path, int openFlags, int shareMode, out int err, IntPtr pv)
        {
            if (CabNumbers.ContainsKey(path))
            {
                Stream stream = CabStream;
                if (stream == null)
                {
                    short cabNumber = CabNumbers[path];

                    stream = context.OpenArchiveReadStream(cabNumber, path, CabEngine);
                    if (stream == null)
                    {
                        throw new FileNotFoundException(String.Format(CultureInfo.InvariantCulture, "Cabinet {0} not provided.", cabNumber));
                    }
                    currentArchiveName   = path;
                    currentArchiveNumber = cabNumber;
                    if (this.totalArchives <= currentArchiveNumber)
                    {
                        int totalArchives = currentArchiveNumber + 1;
                        this.totalArchives = (short)totalArchives;
                    }
                    currentArchiveTotalBytes     = stream.Length;
                    currentArchiveBytesProcessed = 0;

                    if (folderId != -3) // -3 is a special folderId that requires re-opening the same cab
                    {
                        OnProgress(ArchiveProgressType.StartArchive);
                    }
                    CabStream = stream;
                }
                path = CabStreamName;
            }
            return(base.CabOpenStreamEx(path, openFlags, shareMode, out err, pv));
        }
コード例 #2
0
ファイル: CabPacker.cs プロジェクト: jcaillon/CabinetManager
        internal override int CabOpenStreamEx(string path, int openFlags, int shareMode, out int err, IntPtr pv)
        {
            if (CabNumbers.ContainsKey(path))
            {
                Stream stream = CabStream;
                if (stream == null)
                {
                    short cabNumber = CabNumbers[path];

                    currentFolderTotalBytes = 0;

                    stream = context.OpenArchiveWriteStream(cabNumber, path, true, CabEngine);
                    if (stream == null)
                    {
                        throw new FileNotFoundException(
                                  String.Format(CultureInfo.InvariantCulture, "Cabinet {0} not provided.", cabNumber));
                    }

                    currentArchiveName = path;

                    currentArchiveTotalBytes = Math.Min(
                        totalFolderBytesProcessedInCurrentCab, maxCabBytes);
                    currentArchiveBytesProcessed = 0;

                    OnProgress(ArchiveProgressType.StartArchive);
                    CabStream = stream;
                }

                path = CabStreamName;
            }
            else if (path == TempStreamName)
            {
                // Opening memory stream for a temp file.
                Stream stream = new MemoryStream();
                tempStreams.Add(stream);
                int streamHandle = StreamHandles.AllocHandle(stream);
                err = 0;
                return(streamHandle);
            }
            else if (path != CabStreamName)
            {
                // Opening a file on disk for a temp file.
                path = Path.Combine(Path.GetTempPath(), path);
                Stream stream = new FileStream(path, FileMode.Open, FileAccess.ReadWrite);
                tempStreams.Add(stream);
                stream = new DuplicateStream(stream);
                int streamHandle = StreamHandles.AllocHandle(stream);
                err = 0;
                return(streamHandle);
            }

            return(base.CabOpenStreamEx(path, openFlags, shareMode, out err, pv));
        }