public virtual void DeleteFile(FileRecord fileRecord) { MftSegmentReference parentDirectory = fileRecord.ParentDirectoryReference; FileRecord parentDirectoryRecord = GetFileRecord(parentDirectory); IndexData parentDirectoryIndex = new IndexData(this, parentDirectoryRecord, AttributeType.FileName); // Update parent directory index List <FileNameRecord> fileNameRecords = fileRecord.FileNameRecords; foreach (FileNameRecord fileNameRecord in fileNameRecords) { parentDirectoryIndex.RemoveEntry(fileNameRecord.GetBytes()); } // Deallocate all data clusters foreach (AttributeRecord atttributeRecord in fileRecord.Attributes) { if (atttributeRecord is NonResidentAttributeRecord) { NonResidentAttributeData attributeData = new NonResidentAttributeData(this, fileRecord, (NonResidentAttributeRecord)atttributeRecord); attributeData.Truncate(0); } } m_mft.DeleteFile(fileRecord); }
public virtual void DeleteFile(FileRecord fileRecord) { MftSegmentReference parentDirectory = fileRecord.ParentDirectoryReference; FileRecord parentDirectoryRecord = GetFileRecord(parentDirectory); m_mftLock.AcquireWriterLock(Timeout.Infinite); IndexData parentDirectoryIndex = new IndexData(this, parentDirectoryRecord, AttributeType.FileName); uint transactionID = m_logClient.AllocateTransactionID(); // Update parent directory index List <FileNameRecord> fileNameRecords = fileRecord.FileNameRecords; foreach (FileNameRecord fileNameRecord in fileNameRecords) { parentDirectoryIndex.RemoveEntry(fileNameRecord.GetBytes()); } // Deallocate all data clusters foreach (AttributeRecord atttributeRecord in fileRecord.Attributes) { if (atttributeRecord is NonResidentAttributeRecord) { NonResidentAttributeData attributeData = new NonResidentAttributeData(this, fileRecord, (NonResidentAttributeRecord)atttributeRecord); attributeData.Truncate(0); } } m_mft.DeleteFile(fileRecord, transactionID); m_logClient.WriteForgetTransactionRecord(transactionID); m_logClient.WriteRestartRecord(this.MajorVersion, true); m_mftLock.ReleaseWriterLock(); }
public void Truncate(ulong newLengthInBytes) { ulong currentSize = this.Length; if (m_attributeRecord is NonResidentAttributeRecord) { NonResidentAttributeData attributeData = new NonResidentAttributeData(m_volume, m_fileRecord, (NonResidentAttributeRecord)m_attributeRecord); attributeData.Truncate(newLengthInBytes); } else { byte[] data = ((ResidentAttributeRecord)m_attributeRecord).Data; byte[] temp = new byte[newLengthInBytes]; Array.Copy(data, temp, temp.Length); ((ResidentAttributeRecord)m_attributeRecord).Data = temp; if (m_fileRecord != null) { m_volume.UpdateFileRecord(m_fileRecord); } } }
public virtual void DeleteFile(FileRecord fileRecord) { lock (m_mftLock) { MftSegmentReference parentDirectory = fileRecord.ParentDirectoryReference; FileRecord parentDirectoryRecord = GetFileRecord(parentDirectory); IndexData parentDirectoryIndex = new IndexData(this, parentDirectoryRecord, AttributeType.FileName); if (fileRecord.IsDirectory) { IndexData directoryIndex = new IndexData(this, fileRecord, AttributeType.FileName); if (!directoryIndex.IsEmpty) { throw new DirectoryNotEmptyException(); } } uint transactionID = m_logClient.AllocateTransactionID(); // Update parent directory index List <FileNameRecord> fileNameRecords = fileRecord.FileNameRecords; foreach (FileNameRecord fileNameRecord in fileNameRecords) { parentDirectoryIndex.RemoveEntry(fileNameRecord.GetBytes()); } // Deallocate all data clusters foreach (AttributeRecord atttributeRecord in fileRecord.Attributes) { if (atttributeRecord is NonResidentAttributeRecord) { NonResidentAttributeData attributeData = new NonResidentAttributeData(this, fileRecord, (NonResidentAttributeRecord)atttributeRecord); attributeData.Truncate(0); } } m_mft.DeleteFile(fileRecord, transactionID); m_logClient.WriteForgetTransactionRecord(transactionID); m_logClient.WriteRestartRecord(true); } }