Skip to content

[refactor] Add ClassifyEntry method to IFileSystemInspector #263

@paul-fresquet

Description

@paul-fresquet

Summary

Refactor IFileSystemInspector to add a centralized ClassifyEntry method that returns the FileSystemEntryKind for any filesystem entry, consolidating all classification logic in one place.

Background

Currently, IFileSystemInspector has separate boolean methods:

  • IsHidden()
  • IsSystem()
  • IsReparsePoint()
  • IsOffline()
  • IsRecallOnDataAccess()

Classification logic is scattered between FileSystemInspector and InventoryBuilder. This refactoring centralizes the "what type is this entry?" question.

Proposed Interface Changes

public interface IFileSystemInspector
{
    // Existing methods (keep for backward compatibility)
    bool IsHidden(FileSystemInfo fsi, OSPlatforms os);
    bool IsSystem(FileInfo fileInfo);
    bool IsReparsePoint(FileSystemInfo fsi);
    bool Exists(FileInfo fileInfo);
    bool IsOffline(FileInfo fileInfo);
    bool IsRecallOnDataAccess(FileInfo fileInfo);
    
    // New classification method
    FileSystemEntryKind ClassifyEntry(FileSystemInfo fsi);
}

Classification Logic

The ClassifyEntry method should:

  1. Check for symlink first (via LinkTarget or ReparsePoint)
  2. On Linux/macOS: use POSIX detection for special files
  3. Return Directory for DirectoryInfo
  4. Return RegularFile for standard FileInfo
  5. Return Unknown if classification fails

Acceptance Criteria

  • Add ClassifyEntry(FileSystemInfo fsi) to IFileSystemInspector
  • Implement in FileSystemInspector with full classification logic
  • Integrate POSIX detection (depends on Mono.Posix integration)
  • Symlink detection using LinkTarget property (cross-platform)
  • Fallback to ReparsePoint check for Windows compatibility
  • Unit tests for each entry kind on appropriate platforms
  • Existing boolean methods remain functional (no breaking changes)

Dependencies

Technical Notes

Example implementation structure:

public FileSystemEntryKind ClassifyEntry(FileSystemInfo fsi)
{
    // 1. Symlink check (cross-platform)
    if (fsi.LinkTarget != null || IsReparsePoint(fsi))
        return FileSystemEntryKind.Symlink;
    
    // 2. POSIX special files (Linux/macOS only)
    if (OperatingSystem.IsLinux() || OperatingSystem.IsMacOS())
    {
        var posixKind = ClassifyPosixEntry(fsi.FullName);
        if (posixKind != FileSystemEntryKind.Unknown)
            return posixKind;
    }
    
    // 3. Standard types
    return fsi switch
    {
        DirectoryInfo => FileSystemEntryKind.Directory,
        FileInfo => FileSystemEntryKind.RegularFile,
        _ => FileSystemEntryKind.Unknown
    };
}

Priority

Important — Core architectural improvement for classification system.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions