public override Int32 SetReparsePoint( Object FileNode0, Object FileDesc, String FileName, Byte[] ReparseData) { FileNode FileNode = (FileNode)FileNode0; if (null != FileNode.MainFileNode) { FileNode = FileNode.MainFileNode; } if (FileNodeMap.HasChild(FileNode)) { return(STATUS_DIRECTORY_NOT_EMPTY); } if (null != FileNode.ReparseData) { Int32 Result = CanReplaceReparsePoint(FileNode.ReparseData, ReparseData); if (0 > Result) { return(Result); } } FileNode.FileInfo.FileAttributes |= (UInt32)FileAttributes.ReparsePoint; FileNode.FileInfo.ReparseTag = GetReparseTag(ReparseData); FileNode.ReparseData = ReparseData; return(STATUS_SUCCESS); }
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 CanDelete( Object FileNode0, Object FileDesc, String FileName) { FileNode FileNode = (FileNode)FileNode0; if (FileNodeMap.HasChild(FileNode)) { return(STATUS_DIRECTORY_NOT_EMPTY); } return(STATUS_SUCCESS); }