Merge branch 'qdls'
This commit is contained in:
commit
fa743c5a34
5 changed files with 113 additions and 0 deletions
|
@ -11,3 +11,7 @@ paths like missing support for symbolic links, mismatched path separators,
|
||||||
inability to handle spaces in directory names, and resolves C-drive paths to
|
inability to handle spaces in directory names, and resolves C-drive paths to
|
||||||
their normal DOS form.
|
their normal DOS form.
|
||||||
|
|
||||||
|
## `qdls`
|
||||||
|
|
||||||
|
A DOS clone of `ls` that hides Windows hidden files.
|
||||||
|
|
||||||
|
|
4
qdls/.gitignore
vendored
Normal file
4
qdls/.gitignore
vendored
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
obj/
|
||||||
|
bin/
|
||||||
|
.idea/
|
||||||
|
|
66
qdls/Program.cs
Normal file
66
qdls/Program.cs
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
using Qdls;
|
||||||
|
|
||||||
|
// collect args and consume flags
|
||||||
|
List<string> arguments = args.ToList();
|
||||||
|
|
||||||
|
bool showHidden = Util.CheckFlag(arguments, "-a", "--all", "-A");
|
||||||
|
|
||||||
|
// default to "." if no target args
|
||||||
|
if(arguments.Count == 0)
|
||||||
|
arguments = ["."];
|
||||||
|
|
||||||
|
// run on targets
|
||||||
|
foreach(var arg in arguments) {
|
||||||
|
// don't try to list nonexistent entries or files
|
||||||
|
if(!Path.Exists(arg)) {
|
||||||
|
Console.WriteLine($"'{arg}': does not exist");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if(File.Exists(arg)) {
|
||||||
|
Console.WriteLine($"'{arg}': is file");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// fetch children
|
||||||
|
var children = Directory.GetFileSystemEntries(arg);
|
||||||
|
// exclude hidden files where applicable
|
||||||
|
if(!showHidden) { children = children.Where(f => !Util.IsHidden(f)).ToArray(); }
|
||||||
|
|
||||||
|
// state vars
|
||||||
|
var buffer = "";
|
||||||
|
var longest = Path.GetFileName(children.OrderByDescending(s => s.Length).First()).Length;
|
||||||
|
var columns = Console.WindowWidth / (longest + 2);
|
||||||
|
var multiline = columns < children.Count();
|
||||||
|
var position = 0;
|
||||||
|
|
||||||
|
// print names if more than one target
|
||||||
|
if(args.Length > 1)
|
||||||
|
Console.WriteLine($"{arg}:");
|
||||||
|
// iterate over children; build buffer and output when full
|
||||||
|
foreach(var child in children.OrderBy(f => (int)(Path.GetFileName(f)[0]))) {
|
||||||
|
var name = Path.GetFileName(child);
|
||||||
|
|
||||||
|
// format hidden files
|
||||||
|
if(Util.IsHidden(child))
|
||||||
|
buffer += Format.Hidden;
|
||||||
|
|
||||||
|
// format directories
|
||||||
|
if(Directory.Exists(child))
|
||||||
|
buffer += Format.Directory;
|
||||||
|
|
||||||
|
// if we pass max width, write buffer and clear
|
||||||
|
if( (++position > columns) && multiline ) {
|
||||||
|
position = 1;
|
||||||
|
Console.WriteLine(buffer.TrimEnd());
|
||||||
|
buffer = "";
|
||||||
|
}
|
||||||
|
if(multiline)
|
||||||
|
buffer += $"{name}{Format.Reset}".PadRight(longest + 6); // magic number 6 is +2 ignoring ansi reset sequence
|
||||||
|
else
|
||||||
|
buffer += $"{name}{Format.Reset} ";
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// print last line
|
||||||
|
Console.WriteLine(buffer);
|
||||||
|
}
|
29
qdls/Util.cs
Normal file
29
qdls/Util.cs
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
namespace Qdls;
|
||||||
|
|
||||||
|
using System.IO;
|
||||||
|
|
||||||
|
public static class Util {
|
||||||
|
|
||||||
|
public static bool IsHidden(string path) {
|
||||||
|
var name = Path.GetFileName(path);
|
||||||
|
return
|
||||||
|
name.StartsWith('.') ||
|
||||||
|
( File.GetAttributes(path) & FileAttributes.Hidden ) == FileAttributes.Hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool CheckFlag(List<String> args, params string[] forms) {
|
||||||
|
var found = args.RemoveAll(forms.Contains);
|
||||||
|
return found > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Format {
|
||||||
|
|
||||||
|
public const string Reset = "\x1b[0m"; // reset
|
||||||
|
public const string Hidden = "\x1b[2;3m"; // faint + italic
|
||||||
|
public const string Executable = "\x1b[1;32m"; // bold + green
|
||||||
|
public const string Directory = "\x1b[1;34m"; // bold + blue
|
||||||
|
|
||||||
|
}
|
||||||
|
|
10
qdls/qdls.csproj
Normal file
10
qdls/qdls.csproj
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
</Project>
|
Loading…
Reference in a new issue