/// <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; } }
/// <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."; } } }