public static DirectoryEntry ReadFrom(DataReader reader) { long startPos = reader.Position; long length = reader.ReadInt64(); if (length == 0) { return null; } DirectoryEntry result = new DirectoryEntry(); result.Length = length; result.Attributes = (FileAttributes)reader.ReadUInt32(); result.SecurityId = reader.ReadUInt32(); result.SubdirOffset = reader.ReadInt64(); reader.Skip(16); result.CreationTime = reader.ReadInt64(); result.LastAccessTime = reader.ReadInt64(); result.LastWriteTime = reader.ReadInt64(); result.Hash = reader.ReadBytes(20); reader.Skip(4); result.ReparseTag = reader.ReadUInt32(); result.HardLink = reader.ReadUInt32(); result.StreamCount = reader.ReadUInt16(); int shortNameLength = reader.ReadUInt16(); int fileNameLength = reader.ReadUInt16(); if (fileNameLength > 0) { result.FileName = Encoding.Unicode.GetString(reader.ReadBytes(fileNameLength + 2)).TrimEnd('\0'); } else { result.FileName = string.Empty; } if (shortNameLength > 0) { result.ShortName = Encoding.Unicode.GetString(reader.ReadBytes(shortNameLength + 2)).TrimEnd('\0'); } else { result.ShortName = null; } if (startPos + length > reader.Position) { int toRead = (int)(startPos + length - reader.Position); reader.Skip(toRead); } if (result.StreamCount > 0) { result.AlternateStreams = new Dictionary<string, AlternateStreamEntry>(); for (int i = 0; i < result.StreamCount; ++i) { AlternateStreamEntry stream = AlternateStreamEntry.ReadFrom(reader); result.AlternateStreams.Add(stream.Name, stream); } } return result; }
/// <summary> /// Indicates if a file exists. /// </summary> /// <param name="path">The path to test.</param> /// <returns>true if the file exists.</returns> public override bool FileExists(string path) { DirectoryEntry dirEntry = GetEntry(path); return(dirEntry != null && (dirEntry.Attributes & FileAttributes.Directory) == 0); }
/// <summary> /// Gets the file id for a given path. /// </summary> /// <param name="path">The path to get the id of.</param> /// <returns>The file id, or -1.</returns> /// <remarks> /// The returned file id uniquely identifies the file, and is shared by all hard /// links to the same file. The value -1 indicates no unique identifier is /// available, and so it can be assumed the file has no hard links. /// </remarks> public long GetFileId(string path) { DirectoryEntry dirEntry = GetEntry(path); return(dirEntry.HardLink == 0 ? -1 : (long)dirEntry.HardLink); }
/// <summary> /// Indicates whether the file is known by other names. /// </summary> /// <param name="path">The file to inspect.</param> /// <returns><c>true</c> if the file has other names, else <c>false</c>.</returns> public bool HasHardLinks(string path) { DirectoryEntry dirEntry = GetEntry(path); return(dirEntry.HardLink != 0); }
/// <summary> /// Gets the short name for a given path. /// </summary> /// <param name="path">The path to convert.</param> /// <returns>The short name.</returns> /// <remarks> /// This method only gets the short name for the final part of the path, to /// convert a complete path, call this method repeatedly, once for each path /// segment. If there is no short name for the given path,<c>null</c> is /// returned. /// </remarks> public string GetShortName(string path) { DirectoryEntry dirEntry = GetEntry(path); return(dirEntry.ShortName); }