コード例 #1
0
        /// <summary>A constructor to initialize a <c>new PairOfFiles</c>.</summary>
        /// <param name="FromStream"></param>
        /// <param name="SourceOrDestinationDrive"></param>
        /// <param name="TextEncoder"></param>
        public PairOfFiles(Stream FromStream, PairOfFiles ParentDirectory, bool isSource, TextConverter TextConverter) : this()
        {
            byte[] abBuffer, abTextBytes;
            ushort tTextLength;
            uint   uAttributes, uFirstBlock = 0;
            long   kCreationTimeTicks, kLastAccessTimeTicks, kLastWriteTimeTicks, kSize = -1;

            _ParentDirectory  = ParentDirectory;
            _SourceDrive      = _ParentDirectory.SourceDrive;
            _DestinationDrive = _ParentDirectory.DestinationDrive;
            _TextConverter    = TextConverter;
            abBuffer          = new byte[8];

            FromStream.Read(abBuffer, 0, 2);
            tTextLength = BitConverter.ToUInt16(abBuffer, 0);
            abTextBytes = new byte[tTextLength];
            FromStream.Read(abTextBytes, 0, tTextLength);
            _sRelativePath = _TextConverter.BytesToString(abTextBytes);

            FromStream.Read(abBuffer, 0, 4);
            uAttributes  = BitConverter.ToUInt32(abBuffer, 0);
            _isDirectory = ((uAttributes & (uint)FileAttributes.Directory) > 0);
            FromStream.Read(abBuffer, 0, 8);
            kCreationTimeTicks = BitConverter.ToInt64(abBuffer, 0);
            FromStream.Read(abBuffer, 0, 8);
            kLastAccessTimeTicks = BitConverter.ToInt64(abBuffer, 0);
            FromStream.Read(abBuffer, 0, 8);
            kLastWriteTimeTicks = BitConverter.ToInt64(abBuffer, 0);

            if (!_isDirectory)
            {
                FromStream.Read(abBuffer, 0, 8);
                kSize = BitConverter.ToInt64(abBuffer, 0);
                if ((isSource && (_SourceDrive.eEncryptionType == Drive.nEncryptionType.DirectorySymmetric)) || (!isSource && (_DestinationDrive.eEncryptionType == Drive.nEncryptionType.DirectorySymmetric)))
                {
                    FromStream.Read(abBuffer, 0, 4);
                    uFirstBlock = BitConverter.ToUInt32(abBuffer, 0);
                }
            }

            if (isSource)
            {
                _uAttributesSource    = uAttributes;
                _CreationTimeSource   = new DateTime(kCreationTimeTicks);
                _LastAccessTimeSource = new DateTime(kLastAccessTimeTicks);
                LastWriteTimeSource   = new DateTime(kLastWriteTimeTicks);
                _kSourceSize          = kSize;
                _sSourceSize          = FileSizeToString(kSize);
                _uFirstBlockSource    = uFirstBlock;
                _eComparison          = nComparison.UnknownDestination;
            }
            else
            {
                _uAttributesDestination    = uAttributes;
                _CreationTimeDestination   = new DateTime(kCreationTimeTicks);
                _LastAccessTimeDestination = new DateTime(kLastAccessTimeTicks);
                LastWriteTimeDestination   = new DateTime(kLastWriteTimeTicks);
                _kDestinationSize          = kSize;
                _sDestinationSize          = FileSizeToString(kSize);
                _uFirstBlockDestination    = uFirstBlock;
                _eComparison = nComparison.UnknownSource;
            }
        }
コード例 #2
0
        /// <summary>A constructor to initialize a <c>new PairOfFiles</c>.</summary>
        /// <param name="SourceDrive"></param>
        /// <param name="DestinationDrive"></param>
        /// <param name="sRelativePath">The relative 'end' path is identical for both files, even though they are stored in different directories.</param>
        /// <param name="eComparison">Type of synchronization that needs to be performed within this <c>PairOfFiles</c>.</param>
        /// <param name="isDirectory">True if this is a pair of directories. Technically, a directory is a special case of a file.</param>
        public PairOfFiles(PairOfFiles ParentDirectory, string sRelativePath, nComparison eComparison, bool isDirectory, TextConverter TextConverter) : this()
        {
            _ParentDirectory  = ParentDirectory;
            _SourceDrive      = _ParentDirectory.SourceDrive;
            _DestinationDrive = _ParentDirectory.DestinationDrive;
            _eComparison      = eComparison;
            _isDirectory      = isDirectory;
            _TextConverter    = TextConverter;

            if (string.IsNullOrEmpty(sRelativePath))
            {
                throw new ArgumentException("Relative path must not be empty.");
            }
            else if ((sRelativePath[0] == '\\') || (sRelativePath[0] == '/'))
            {
                throw new ArgumentException("Relative path '" + sRelativePath + "' must not start with a slash.");
            }
            else
            {
                _sRelativePath = sRelativePath;
            }

            foreach (string sDirectory in casSkipDirectories)
            {
                if ((_sRelativePath.Length >= sDirectory.Length) && (_sRelativePath.Substring(0, sDirectory.Length) == sDirectory))
                {
                    _eComparison   = nComparison.Error;
                    _sErrorMessage = "This directory is excluded by default.";
                }
            }
        }