Skip to content

Commit

Permalink
Add missing check in public property FileSystemEntry.IsHidden. Addres…
Browse files Browse the repository at this point in the history
…s PR suggestions.
  • Loading branch information
carlossanlop committed Aug 13, 2020
1 parent aff0182 commit cfb8175
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 24 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ namespace System.IO.Enumeration
// IMPORTANT: Attribute logic must match the logic in FileStatus

bool isDirectory = false;
bool isSymlink = false;
if (directoryEntry.InodeType == Interop.Sys.NodeType.DT_DIR)
{
// We know it's a directory.
Expand All @@ -45,9 +46,9 @@ namespace System.IO.Enumeration
// Some operating systems don't have the inode type in the dirent structure,
// so we use DT_UNKNOWN as a sentinel value. As such, check if the dirent is a
// directory.
else if ((directoryEntry.InodeType == Interop.Sys.NodeType.DT_LNK ||
directoryEntry.InodeType == Interop.Sys.NodeType.DT_UNKNOWN) &&
Interop.Sys.Stat(entry.FullPath, out Interop.Sys.FileStatus statInfo) >= 0)
else if ((directoryEntry.InodeType == Interop.Sys.NodeType.DT_LNK
|| directoryEntry.InodeType == Interop.Sys.NodeType.DT_UNKNOWN)
&& Interop.Sys.Stat(entry.FullPath, out Interop.Sys.FileStatus statInfo) >= 0)
{
// Symlink or unknown: Stat to it to see if we can resolve it to a directory.
isDirectory = FileStatus.IsDirectory(statInfo);
Expand All @@ -58,24 +59,25 @@ namespace System.IO.Enumeration

bool isReadOnly = resultLStat >= 0 && FileStatus.IsReadOnly(lstatInfo);

bool isSymlink = false;
if (directoryEntry.InodeType == Interop.Sys.NodeType.DT_LNK)
{
isSymlink = true;
}
else if (directoryEntry.InodeType == Interop.Sys.NodeType.DT_UNKNOWN && resultLStat >= 0)
else if (resultLStat >= 0 && directoryEntry.InodeType == Interop.Sys.NodeType.DT_UNKNOWN)
{
isSymlink = FileStatus.IsSymLink(lstatInfo);
}

// If the filename starts with a period or has UF_HIDDEN flag set, it's hidden.
bool isHidden = directoryEntry.Name[0] == '.' || (resultLStat >= 0 && FileStatus.IsHidden(lstatInfo));

entry._status = default;
FileStatus.Initialize(ref entry._status, isDirectory);

FileAttributes attributes = FileStatus.GetAttributes(isReadOnly, isSymlink, isDirectory, isHidden);
entry._initialAttributes = attributes;
return attributes;

entry._initialAttributes = attributes;
return attributes;
}

private ReadOnlySpan<char> FullPath
Expand Down Expand Up @@ -138,7 +140,7 @@ public FileAttributes Attributes
public DateTimeOffset LastAccessTimeUtc => _status.GetLastAccessTime(FullPath, continueOnError: true);
public DateTimeOffset LastWriteTimeUtc => _status.GetLastWriteTime(FullPath, continueOnError: true);
public bool IsDirectory => _status.InitiallyDirectory;
public bool IsHidden => _directoryEntry.Name[0] == '.';
public bool IsHidden => _directoryEntry.Name[0] == '.' || (Attributes & FileAttributes.Hidden) != 0;

public FileSystemInfo ToFileSystemInfo()
{
Expand Down
30 changes: 14 additions & 16 deletions src/libraries/System.IO.FileSystem/src/System/IO/FileStatus.Unix.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,16 +34,12 @@ internal struct FileStatus
status._fileStatusInitialized = -1;
}

internal void Invalidate() => _fileStatusInitialized = -1;

internal static bool IsDirectory(Interop.Sys.FileStatus fileStatus)
{
return (fileStatus.Mode & Interop.Sys.FileTypes.S_IFMT) == Interop.Sys.FileTypes.S_IFDIR;
}

internal static bool IsHidden(Interop.Sys.FileStatus fileStatus)
internal bool IsReadOnly(ReadOnlySpan<char> path, bool continueOnError = false)
{
// If the filename starts with a period or has UF_HIDDEN flag set, it's hidden.
return (fileStatus.UserFlags & (uint)Interop.Sys.UserFlags.UF_HIDDEN) == (uint)Interop.Sys.UserFlags.UF_HIDDEN;
EnsureStatInitialized(path, continueOnError);
return IsReadOnly(_fileStatus);
}

internal static bool IsReadOnly(Interop.Sys.FileStatus fileStatus)
Expand Down Expand Up @@ -77,6 +73,16 @@ internal static bool IsReadOnly(Interop.Sys.FileStatus fileStatus)
(fileStatus.Mode & (int)writeBit) == 0; // but not write permission
}

internal static bool IsDirectory(Interop.Sys.FileStatus fileStatus)
{
return (fileStatus.Mode & Interop.Sys.FileTypes.S_IFMT) == Interop.Sys.FileTypes.S_IFDIR;
}

internal static bool IsHidden(Interop.Sys.FileStatus fileStatus)
{
return (fileStatus.UserFlags & (uint)Interop.Sys.UserFlags.UF_HIDDEN) == (uint)Interop.Sys.UserFlags.UF_HIDDEN;
}

internal static bool IsSymLink(Interop.Sys.FileStatus fileStatus)
{
return (fileStatus.Mode & Interop.Sys.FileTypes.S_IFMT) == Interop.Sys.FileTypes.S_IFLNK;
Expand All @@ -98,14 +104,6 @@ internal static FileAttributes GetAttributes(bool isReadOnly, bool isSymlink, bo
return attributes != default ? attributes : FileAttributes.Normal;
}

internal void Invalidate() => _fileStatusInitialized = -1;

internal bool IsReadOnly(ReadOnlySpan<char> path, bool continueOnError = false)
{
EnsureStatInitialized(path, continueOnError);
return IsReadOnly(_fileStatus);
}

public FileAttributes GetAttributes(ReadOnlySpan<char> path, ReadOnlySpan<char> fileName)
{
// IMPORTANT: Attribute logic must match the logic in FileSystemEntry
Expand Down

0 comments on commit cfb8175

Please sign in to comment.