private void ProcessDirectoryRestore(VolumeSnapshotDirectory sourceDir, BaseArchive archive, int relativePathStartIndex, string targetDir)
        {
            if (!mOperation.CanContinue)
            {
                return;
            }

            PWLib.Platform.Windows.Directory.CreateDirectory(targetDir);

            foreach (VolumeSnapshotFile fileEntry in sourceDir.Files)
            {
                try
                {
                    string outDir = targetDir + fileEntry.RelativePath.Substring(relativePathStartIndex);
                    archive.RestoreFile(fileEntry.Revision, fileEntry.RelativePath, outDir, new ArchiveFileDelegate(Restore_ArchiveStoreFile), fileEntry);

                    ulong runningSize = mFilesTotalSizeRunning + fileEntry.FileSize;
                    if (runningSize > mFilesTotalSize)
                    {
                        runningSize = mFilesTotalSize;
                    }
                    if (Progress != null)
                    {
                        Progress(mFileRunningCount + 1, mFileTotalCount, runningSize, mFilesTotalSize);
                    }
                }
                catch (System.Exception e)
                {
                    if (Error != null)
                    {
                        Error("Restore file failed '" + fileEntry.RelativePath + "'", e);
                    }
                }

                if (!mOperation.CanContinue)
                {
                    return;
                }

                mFileRunningCount++;
                mFilesTotalSizeRunning += fileEntry.FileSize;
            }

            foreach (VolumeSnapshotDirectory directoryEntry in sourceDir.Directories)
            {
                ProcessDirectoryRestore(directoryEntry, archive, relativePathStartIndex, targetDir);
                if (!mOperation.CanContinue)
                {
                    return;
                }
            }
        }
        private void ProcessDirectoryRestore( VolumeSnapshotDirectory sourceDir, BaseArchive archive, int relativePathStartIndex, string targetDir )
        {
            if ( !mOperation.CanContinue )
                return;

            PWLib.Platform.Windows.Directory.CreateDirectory( targetDir );

            foreach ( VolumeSnapshotFile fileEntry in sourceDir.Files )
            {
                try
                {
                    string outDir = targetDir + fileEntry.RelativePath.Substring( relativePathStartIndex );
                    archive.RestoreFile( fileEntry.Revision, fileEntry.RelativePath, outDir, new ArchiveFileDelegate( Restore_ArchiveStoreFile ), fileEntry );

                    ulong runningSize = mFilesTotalSizeRunning + fileEntry.FileSize;
                    if ( runningSize > mFilesTotalSize )
                        runningSize = mFilesTotalSize;
                    if ( Progress != null )
                        Progress( mFileRunningCount + 1, mFileTotalCount, runningSize, mFilesTotalSize );
                }
                catch ( System.Exception e )
                {
                    if ( Error != null )
                        Error( "Restore file failed '" + fileEntry.RelativePath + "'", e );
                }

                if ( !mOperation.CanContinue )
                    return;

                mFileRunningCount++;
                mFilesTotalSizeRunning += fileEntry.FileSize;
            }

            foreach ( VolumeSnapshotDirectory directoryEntry in sourceDir.Directories )
            {
                ProcessDirectoryRestore( directoryEntry, archive, relativePathStartIndex, targetDir );
                if ( !mOperation.CanContinue )
                    return;
            }
        }