public override void Cleanup( Object FileNode0, Object FileDesc, String FileName, UInt32 Flags) { FileNode FileNode = (FileNode)FileNode0; FileNode MainFileNode = null != FileNode.MainFileNode ? FileNode.MainFileNode : FileNode; if (0 != (Flags & CleanupSetArchiveBit)) { if (0 == (MainFileNode.FileInfo.FileAttributes & (UInt32)FileAttributes.Directory)) { MainFileNode.FileInfo.FileAttributes |= (UInt32)FileAttributes.Archive; } } if (0 != (Flags & (CleanupSetLastAccessTime | CleanupSetLastWriteTime | CleanupSetChangeTime))) { UInt64 SystemTime = (UInt64)DateTime.Now.ToFileTimeUtc(); if (0 != (Flags & CleanupSetLastAccessTime)) { MainFileNode.FileInfo.LastAccessTime = SystemTime; } if (0 != (Flags & CleanupSetLastWriteTime)) { MainFileNode.FileInfo.LastWriteTime = SystemTime; } if (0 != (Flags & CleanupSetChangeTime)) { MainFileNode.FileInfo.ChangeTime = SystemTime; } } if (0 != (Flags & CleanupSetAllocationSize)) { UInt64 AllocationUnit = MEMFS_SECTOR_SIZE * MEMFS_SECTORS_PER_ALLOCATION_UNIT; UInt64 AllocationSize = (FileNode.FileInfo.FileSize + AllocationUnit - 1) / AllocationUnit * AllocationUnit; SetFileSizeInternal(FileNode, AllocationSize, true); } if (0 != (Flags & CleanupDelete) && !FileNodeMap.HasChild(FileNode)) { List <String> StreamFileNames = new List <String>(FileNodeMap.GetStreamFileNames(FileNode)); foreach (String StreamFileName in StreamFileNames) { FileNode StreamNode = FileNodeMap.Get(StreamFileName); if (null == StreamNode) { continue; /* should not happen */ } FileNodeMap.Remove(StreamNode); } FileNodeMap.Remove(FileNode); } }
public override Int32 Overwrite( Object FileNode0, Object FileDesc, UInt32 FileAttributes, Boolean ReplaceFileAttributes, UInt64 AllocationSize, out FileInfo FileInfo) { FileInfo = default(FileInfo); FileNode FileNode = (FileNode)FileNode0; Int32 Result; List <String> StreamFileNames = new List <String>(FileNodeMap.GetStreamFileNames(FileNode)); foreach (String StreamFileName in StreamFileNames) { FileNode StreamNode = FileNodeMap.Get(StreamFileName); if (null == StreamNode) { continue; /* should not happen */ } if (0 == StreamNode.OpenCount) { FileNodeMap.Remove(StreamNode); } } Result = SetFileSizeInternal(FileNode, AllocationSize, true); if (0 > Result) { return(Result); } if (ReplaceFileAttributes) { FileNode.FileInfo.FileAttributes = FileAttributes | (UInt32)System.IO.FileAttributes.Archive; } else { FileNode.FileInfo.FileAttributes |= FileAttributes | (UInt32)System.IO.FileAttributes.Archive; } FileNode.FileInfo.FileSize = 0; FileNode.FileInfo.LastAccessTime = FileNode.FileInfo.LastWriteTime = FileNode.FileInfo.ChangeTime = (UInt64)DateTime.Now.ToFileTimeUtc(); FileInfo = FileNode.GetFileInfo(); return(STATUS_SUCCESS); }
public override Int32 Rename( Object FileNode0, Object FileDesc, String FileName, String NewFileName, Boolean ReplaceIfExists) { FileNode FileNode = (FileNode)FileNode0; FileNode NewFileNode; NewFileNode = FileNodeMap.Get(NewFileName); if (null != NewFileNode && FileNode != NewFileNode) { if (!ReplaceIfExists) { return(STATUS_OBJECT_NAME_COLLISION); } if (0 != (NewFileNode.FileInfo.FileAttributes & (UInt32)FileAttributes.Directory)) { return(STATUS_ACCESS_DENIED); } } if (null != NewFileNode && FileNode != NewFileNode) { FileNodeMap.Remove(NewFileNode); } List <String> DescendantFileNames = new List <String>(FileNodeMap.GetDescendantFileNames(FileNode)); foreach (String DescendantFileName in DescendantFileNames) { FileNode DescendantFileNode = FileNodeMap.Get(DescendantFileName); if (null == DescendantFileNode) { continue; /* should not happen */ } FileNodeMap.Remove(DescendantFileNode); DescendantFileNode.FileName = NewFileName + DescendantFileNode.FileName.Substring(FileName.Length); FileNodeMap.Insert(DescendantFileNode); } return(STATUS_SUCCESS); }