//Створення файлу вручну public FileElement(DirElement parent, Header parentHeader, SafeStreamAccess dataFileStream, string Name, Stream fileStream, bool isCompressed, Object addElementLocker, Object changeElementsLocker, Bitmap Icon = null, SafeStreamAccess.ProgressCallback Progress = null) : base(addElementLocker, changeElementsLocker) { lock (_addElementLocker) { UInt64 fileSize = (UInt64)fileStream.Length; byte[] icon = GetIconBytes(Icon); UInt32 iconSize = icon == null ? 0 : (UInt32)icon.Length; UInt64 fileStartPos = dataFileStream.GetFreeSpaceStartPos(Crypto.GetMod16(fileSize)); //Вибираємо місце куди писати файл UInt64 iconStartPos = dataFileStream.GetFreeSpaceStartPos(Crypto.GetMod16(iconSize)); //Вибираємо місце куди писати іконку iconStartPos = (iconStartPos == fileStartPos) ? iconStartPos += Crypto.GetMod16(fileSize) : iconStartPos; lock (dataFileStream.writeLock) { header = new Header(parentHeader.headersFileStream, parentHeader.AES, ElementType.File); this.dataFileStream = dataFileStream; _Name = Name; _ParentID = parent.ID; _FileStartPos = fileStartPos; _FileSize = fileSize; _IconStartPos = iconStartPos; _IconSize = iconSize; _IsCompressed = isCompressed; _Hash = new byte[16]; CryptoRandom.GetBytes(_Hash); _PHash = GetPHash(Icon); SaveInf(); _Exists = false; } AesCryptoServiceProvider AES = GetFileAES(_FileIV); if (fileSize > 0) { dataFileStream.WriteEncrypt((long)fileStartPos, fileStream, AES, out _Hash, Progress); } if ((icon != null) && (iconSize > 0)) { AES.IV = _IconIV; dataFileStream.WriteEncrypt((long)iconStartPos, icon, AES); } //Закидаємо файл в потрібну папку і записуємо зміни _Exists = true; ChangeParent(parent, true); } }
public bool Save() { lock (_headersFileStream.writeLock) { SetAESValue(); byte[] buf = ToBufferFirstBlock(); _headersFileStream.Write((long)(_StartPos), buf, 0, buf.Length); _headersFileStream.WriteEncrypt((long)(_StartPos) + buf.Length, ToBufferEncryptBlock(), AES); } writedInFile = true; return(true); }
//Створення папки вручну protected DirElement(DirElement parent, SafeStreamAccess dataFileStream, string Name, Object addElementLocker, Object changeElementsLocker, Bitmap Icon = null, SafeStreamAccess.ProgressCallback Progress = null) : this(addElementLocker, changeElementsLocker) { lock (_addElementLocker) { lock (dataFileStream.writeLock) { header = new Header(parent.header.headersFileStream, parent.header.AES, ElementType.Dir); this.dataFileStream = dataFileStream; byte[] icon = GetIconBytes(Icon); UInt32 iconSize = icon == null ? 0 : (UInt32)icon.Length; UInt64 iconStartPos = dataFileStream.GetFreeSpaceStartPos(Crypto.GetMod16(iconSize)); //Вибираємо місце куди писати іконку AesCryptoServiceProvider AES = GetFileAES(_IconIV); if ((icon != null) && (iconSize > 0)) { dataFileStream.WriteEncrypt((long)iconStartPos, icon, AES); } _Name = Name; _ID = GenID(); _ParentID = parent.ID; _IconStartPos = iconStartPos; _IconSize = iconSize; _PHash = GetPHash(Icon); Parent = parent; SaveInf(); } } }
private void SetIcon(Bitmap icon) { lock (_addElementLocker) { byte[] buf; UInt32 oldIconSize = _IconSize; //Якщо стара іконка видаляється, то зробити пошук в FreeSpaceMap і додавати туди вільне місце _IconSize = 0; _IconStartPos = GenID(); _PHash = GetPHash(Icon); if (icon != null) { buf = GetIconBytes(icon); _IconSize = (UInt32)buf.Length; if (_IconSize == 0) //Вибираємо місце куди писати іконку { _IconStartPos = GenID(); } else { _IconStartPos = dataFileStream.GetFreeSpaceStartPos(Crypto.GetMod16(_IconSize)); AesCryptoServiceProvider AES = GetFileAES(_IconIV); dataFileStream.WriteEncrypt((long)_IconStartPos, buf, AES); } } SaveInf(); NotifyPropertyChanged("Icon"); buf = null; } }