diff --git a/Aaru.Core/Logging/ErrorLog.cs b/Aaru.Core/Logging/ErrorLog.cs
index d9d697adf..6ca2838d6 100644
--- a/Aaru.Core/Logging/ErrorLog.cs
+++ b/Aaru.Core/Logging/ErrorLog.cs
@@ -379,10 +379,10 @@ public sealed class ErrorLog
if(prettySense != null)
{
if(prettySense.StartsWith("SCSI SENSE: ", StringComparison.Ordinal))
- prettySense = prettySense.Substring(12);
+ prettySense = prettySense[12..];
if(prettySense.EndsWith('\n'))
- prettySense = prettySense.Substring(0, prettySense.Length - 1);
+ prettySense = prettySense[..^1];
prettySense = prettySense.Replace("\n", " - ");
@@ -400,10 +400,10 @@ public sealed class ErrorLog
if(prettySense != null)
{
if(prettySense.StartsWith("SCSI SENSE: ", StringComparison.Ordinal))
- prettySense = prettySense.Substring(12);
+ prettySense = prettySense[12..];
if(prettySense.EndsWith('\n'))
- prettySense = prettySense.Substring(0, prettySense.Length - 1);
+ prettySense = prettySense[..^1];
prettySense = prettySense.Replace("\n", " - ");
@@ -443,10 +443,10 @@ public sealed class ErrorLog
if(prettySense != null)
{
if(prettySense.StartsWith("SCSI SENSE: ", StringComparison.Ordinal))
- prettySense = prettySense.Substring(12);
+ prettySense = prettySense[12..];
if(prettySense.EndsWith('\n'))
- prettySense = prettySense.Substring(0, prettySense.Length - 1);
+ prettySense = prettySense[..^1];
prettySense = prettySense.Replace("\n", " - ");
@@ -464,10 +464,10 @@ public sealed class ErrorLog
if(prettySense != null)
{
if(prettySense.StartsWith("SCSI SENSE: ", StringComparison.Ordinal))
- prettySense = prettySense.Substring(12);
+ prettySense = prettySense[12..];
if(prettySense.EndsWith('\n'))
- prettySense = prettySense.Substring(0, prettySense.Length - 1);
+ prettySense = prettySense[..^1];
prettySense = prettySense.Replace("\n", " - ");
diff --git a/Aaru.Core/Media/Detection/MMC.cs b/Aaru.Core/Media/Detection/MMC.cs
index 3bcfdf41d..6bc3007c9 100644
--- a/Aaru.Core/Media/Detection/MMC.cs
+++ b/Aaru.Core/Media/Detection/MMC.cs
@@ -1288,7 +1288,7 @@ public static class MMC
string name = StringHandlers.CToString(tmpName).ToUpperInvariant();
if(name.EndsWith(";1", StringComparison.InvariantCulture))
- name = name.Substring(0, name.Length - 2);
+ name = name[..^2];
if(name == "PHOTO_CD" &&
(isoSector[rootPos + 25] & 0x02) == 0x02)
@@ -1342,7 +1342,7 @@ public static class MMC
string name = StringHandlers.CToString(tmpName).ToUpperInvariant();
if(name.EndsWith(";1", StringComparison.InvariantCulture))
- name = name.Substring(0, name.Length - 2);
+ name = name[..^2];
if(name == "INFO.PCD")
{
@@ -1775,7 +1775,7 @@ public static class MMC
string name = StringHandlers.CToString(tmpName).ToUpperInvariant();
if(name.EndsWith(";1", StringComparison.InvariantCulture))
- name = name.Substring(0, name.Length - 2);
+ name = name[..^2];
rootEntries.Add(name);
@@ -2020,7 +2020,7 @@ public static class MMC
string name = StringHandlers.CToString(tmpName).ToUpperInvariant();
if(name.EndsWith(";1", StringComparison.InvariantCulture))
- name = name.Substring(0, name.Length - 2);
+ name = name[..^2];
if(name is "INFO.VCD" or "INFO.SVD")
{
@@ -2116,7 +2116,7 @@ public static class MMC
string name = StringHandlers.CToString(tmpName).ToUpperInvariant();
if(name.EndsWith(";1", StringComparison.InvariantCulture))
- name = name.Substring(0, name.Length - 2);
+ name = name[..^2];
if(name == "INFO.PCD")
{
@@ -2210,13 +2210,13 @@ public static class MMC
if(line.StartsWith("BOOT=cdrom:", StringComparison.InvariantCultureIgnoreCase))
{
- ps1BootFile = line.Substring(11);
+ ps1BootFile = line[11..];
if(ps1BootFile.StartsWith('\\'))
- ps1BootFile = ps1BootFile.Substring(1);
+ ps1BootFile = ps1BootFile[1..];
if(ps1BootFile.EndsWith(";1", StringComparison.InvariantCultureIgnoreCase))
- ps1BootFile = ps1BootFile.Substring(0, ps1BootFile.Length - 2);
+ ps1BootFile = ps1BootFile[..^2];
break;
}
@@ -2224,13 +2224,13 @@ public static class MMC
if(!line.StartsWith("BOOT2=cdrom0:", StringComparison.InvariantCultureIgnoreCase))
continue;
- ps2BootFile = line.Substring(13);
+ ps2BootFile = line[13..];
if(ps2BootFile.StartsWith('\\'))
- ps2BootFile = ps2BootFile.Substring(1);
+ ps2BootFile = ps2BootFile[1..];
if(ps2BootFile.EndsWith(";1", StringComparison.InvariantCultureIgnoreCase))
- ps2BootFile = ps2BootFile.Substring(0, ps2BootFile.Length - 2);
+ ps2BootFile = ps2BootFile[..^2];
break;
}
diff --git a/Aaru.Devices/Linux/ListDevices.cs b/Aaru.Devices/Linux/ListDevices.cs
index 61441e027..901defa18 100644
--- a/Aaru.Devices/Linux/ListDevices.cs
+++ b/Aaru.Devices/Linux/ListDevices.cs
@@ -34,9 +34,10 @@ namespace Aaru.Devices.Linux;
using System;
using System.IO;
+using System.Runtime.Versioning;
using System.Text;
-[System.Runtime.Versioning.SupportedOSPlatform("linux")]
+[SupportedOSPlatform("linux")]
static class ListDevices
{
const string PATH_SYS_DEVBLOCK = "/sys/block/";
@@ -124,7 +125,7 @@ static class ListDevices
if(pieces.Length > 1)
{
devices[i].Vendor = pieces[0];
- devices[i].Model = devices[i].Model.Substring(pieces[0].Length + 1);
+ devices[i].Model = devices[i].Model[(pieces[0].Length + 1)..];
}
}
diff --git a/Aaru.Devices/Windows/ListDevices.cs b/Aaru.Devices/Windows/ListDevices.cs
index 251992dfb..88e10cdb3 100644
--- a/Aaru.Devices/Windows/ListDevices.cs
+++ b/Aaru.Devices/Windows/ListDevices.cs
@@ -37,12 +37,13 @@ using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Management;
+using System.Runtime.Versioning;
using System.Text;
using Aaru.Helpers;
using Microsoft.Win32.SafeHandles;
using Marshal = System.Runtime.InteropServices.Marshal;
-[System.Runtime.Versioning.SupportedOSPlatform("windows")]
+[SupportedOSPlatform("windows")]
static class ListDevices
{
/// Converts a hex dump string to the ASCII string it represents
@@ -189,7 +190,7 @@ static class ListDevices
if(pieces?.Length > 1)
{
info.Vendor = pieces[0];
- info.Model = info.Model.Substring(pieces[0].Length + 1);
+ info.Model = info.Model[(pieces[0].Length + 1)..];
}
}
diff --git a/Aaru.Filesystems/FAT/Dir.cs b/Aaru.Filesystems/FAT/Dir.cs
index 04a40cbea..bdc7735ab 100644
--- a/Aaru.Filesystems/FAT/Dir.cs
+++ b/Aaru.Filesystems/FAT/Dir.cs
@@ -73,7 +73,7 @@ public sealed partial class FAT
return ErrorNumber.NoError;
}
- string cutPath = path.StartsWith("/", StringComparison.Ordinal) ? path.Substring(1).ToLower(_cultureInfo)
+ string cutPath = path.StartsWith("/", StringComparison.Ordinal) ? path[1..].ToLower(_cultureInfo)
: path.ToLower(_cultureInfo);
if(_directoryCache.TryGetValue(cutPath, out Dictionary currentDirectory))
@@ -366,9 +366,8 @@ public sealed partial class FAT
foreach(KeyValuePair sidecar in fat32EaSidecars)
{
// No real file this sidecar accompanies
- if(!currentDirectory.
- TryGetValue(sidecar.Key.Substring(0, sidecar.Key.Length - FAT32_EA_TAIL.Length),
- out CompleteDirectoryEntry fileWithEa))
+ if(!currentDirectory.TryGetValue(sidecar.Key[..^FAT32_EA_TAIL.Length],
+ out CompleteDirectoryEntry fileWithEa))
continue;
// If not in debug mode we will consider the lack of EA bitflags to mean the EAs are corrupted or not real
diff --git a/Aaru.Filesystems/FAT/File.cs b/Aaru.Filesystems/FAT/File.cs
index 5712f3320..579deced0 100644
--- a/Aaru.Filesystems/FAT/File.cs
+++ b/Aaru.Filesystems/FAT/File.cs
@@ -293,7 +293,7 @@ public sealed partial class FAT
{
entry = null;
- string cutPath = path.StartsWith('/') ? path.Substring(1).ToLower(_cultureInfo) : path.ToLower(_cultureInfo);
+ string cutPath = path.StartsWith('/') ? path[1..].ToLower(_cultureInfo) : path.ToLower(_cultureInfo);
string[] pieces = cutPath.Split(new[]
{
diff --git a/Aaru.Filesystems/FAT/Super.cs b/Aaru.Filesystems/FAT/Super.cs
index bdc85e791..d1df3a05e 100644
--- a/Aaru.Filesystems/FAT/Super.cs
+++ b/Aaru.Filesystems/FAT/Super.cs
@@ -1050,7 +1050,7 @@ public sealed partial class FAT
foreach(KeyValuePair sidecar in fat32EaSidecars)
{
// No real file this sidecar accompanies
- if(!_rootDirectoryCache.TryGetValue(sidecar.Key.Substring(0, sidecar.Key.Length - FAT32_EA_TAIL.Length),
+ if(!_rootDirectoryCache.TryGetValue(sidecar.Key[..^FAT32_EA_TAIL.Length],
out CompleteDirectoryEntry fileWithEa))
continue;
diff --git a/Aaru.Filesystems/FAT/Xattr.cs b/Aaru.Filesystems/FAT/Xattr.cs
index 27b64825b..6860acbba 100644
--- a/Aaru.Filesystems/FAT/Xattr.cs
+++ b/Aaru.Filesystems/FAT/Xattr.cs
@@ -58,7 +58,7 @@ public sealed partial class FAT
return ErrorNumber.NotSupported;
if(path[0] == '/')
- path = path.Substring(1);
+ path = path[1..];
if(_eaCache.TryGetValue(path.ToLower(_cultureInfo), out Dictionary eas))
{
@@ -111,7 +111,7 @@ public sealed partial class FAT
return err;
if(path[0] == '/')
- path = path.Substring(1);
+ path = path[1..];
if(!xattrs.Contains(xattr.ToLower(_cultureInfo)))
return ErrorNumber.NoSuchExtendedAttribute;
diff --git a/Aaru.Filesystems/FATX/Dir.cs b/Aaru.Filesystems/FATX/Dir.cs
index bbeefe6ef..88d0fce24 100644
--- a/Aaru.Filesystems/FATX/Dir.cs
+++ b/Aaru.Filesystems/FATX/Dir.cs
@@ -56,7 +56,7 @@ public sealed partial class XboxFatPlugin
return ErrorNumber.NoError;
}
- string cutPath = path.StartsWith('/') ? path.Substring(1).ToLower(_cultureInfo) : path.ToLower(_cultureInfo);
+ string cutPath = path.StartsWith('/') ? path[1..].ToLower(_cultureInfo) : path.ToLower(_cultureInfo);
if(_directoryCache.TryGetValue(cutPath, out Dictionary currentDirectory))
{
diff --git a/Aaru.Filesystems/FATX/File.cs b/Aaru.Filesystems/FATX/File.cs
index 5a0efe92b..263b9b6dc 100644
--- a/Aaru.Filesystems/FATX/File.cs
+++ b/Aaru.Filesystems/FATX/File.cs
@@ -252,7 +252,7 @@ public sealed partial class XboxFatPlugin
{
entry = new DirectoryEntry();
- string cutPath = path.StartsWith('/') ? path.Substring(1).ToLower(_cultureInfo) : path.ToLower(_cultureInfo);
+ string cutPath = path.StartsWith('/') ? path[1..].ToLower(_cultureInfo) : path.ToLower(_cultureInfo);
string[] pieces = cutPath.Split(new[]
{
diff --git a/Aaru.Filesystems/ISO9660/Dir.cs b/Aaru.Filesystems/ISO9660/Dir.cs
index 41a818914..41feffe3d 100644
--- a/Aaru.Filesystems/ISO9660/Dir.cs
+++ b/Aaru.Filesystems/ISO9660/Dir.cs
@@ -63,7 +63,7 @@ public sealed partial class ISO9660
}
string cutPath = path.StartsWith("/", StringComparison.Ordinal)
- ? path.Substring(1).ToLower(CultureInfo.CurrentUICulture)
+ ? path[1..].ToLower(CultureInfo.CurrentUICulture)
: path.ToLower(CultureInfo.CurrentUICulture);
if(_directoryCache.TryGetValue(cutPath, out Dictionary currentDirectory))
@@ -142,8 +142,8 @@ public sealed partial class ISO9660
switch(_namespace)
{
case Namespace.Normal:
- contents.Add(entry.Filename.EndsWith(";1", StringComparison.Ordinal)
- ? entry.Filename.Substring(0, entry.Filename.Length - 2) : entry.Filename);
+ contents.Add(entry.Filename.EndsWith(";1", StringComparison.Ordinal) ? entry.Filename[..^2]
+ : entry.Filename);
break;
case Namespace.Vms:
@@ -383,14 +383,14 @@ public sealed partial class ISO9660
// Tailing '.' is only allowed on RRIP. If present it will be recreated below with the alternate name
if(entry.Filename.EndsWith(".", StringComparison.Ordinal))
- entry.Filename = entry.Filename.Substring(0, entry.Filename.Length - 1);
+ entry.Filename = entry.Filename[..^1];
if(entry.Filename.EndsWith(".;1", StringComparison.Ordinal))
- entry.Filename = entry.Filename.Substring(0, entry.Filename.Length - 3) + ";1";
+ entry.Filename = entry.Filename[..^3] + ";1";
// This is a legal Joliet name, different from VMS version fields, but Nero MAX incorrectly creates these filenames
if(_joliet && entry.Filename.EndsWith(";1", StringComparison.Ordinal))
- entry.Filename = entry.Filename.Substring(0, entry.Filename.Length - 2);
+ entry.Filename = entry.Filename[..^2];
int systemAreaStart = entryOff + record.name_len + _directoryRecordSize;
int systemAreaLength = record.length - record.name_len - _directoryRecordSize;
@@ -502,16 +502,16 @@ public sealed partial class ISO9660
while(line != null)
{
// Skip the type field and the first space
- string cutLine = line.Substring(2);
+ string cutLine = line[2..];
int spaceIndex = cutLine.IndexOf(' ');
- string originalName = cutLine.Substring(0, spaceIndex);
+ string originalName = cutLine[..spaceIndex];
string originalNameWithVersion;
- string newName = cutLine.Substring(spaceIndex + 1).TrimStart();
+ string newName = cutLine[(spaceIndex + 1)..].TrimStart();
if(originalName.EndsWith(";1", StringComparison.Ordinal))
{
originalNameWithVersion = originalName.ToLower(CultureInfo.CurrentUICulture);
- originalName = originalNameWithVersion.Substring(0, originalName.Length - 2);
+ originalName = originalNameWithVersion[..(originalName.Length - 2)];
}
else
{
@@ -1040,7 +1040,7 @@ public sealed partial class ISO9660
else
{
string cutPath = path.StartsWith("/", StringComparison.Ordinal)
- ? path.Substring(1).ToLower(CultureInfo.CurrentUICulture)
+ ? path[1..].ToLower(CultureInfo.CurrentUICulture)
: path.ToLower(CultureInfo.CurrentUICulture);
string[] pieces = cutPath.Split(new[]
diff --git a/Aaru.Filesystems/ISO9660/File.cs b/Aaru.Filesystems/ISO9660/File.cs
index 601fcb670..e4f47253c 100644
--- a/Aaru.Filesystems/ISO9660/File.cs
+++ b/Aaru.Filesystems/ISO9660/File.cs
@@ -446,7 +446,7 @@ public sealed partial class ISO9660
entry = null;
string cutPath = path.StartsWith("/", StringComparison.Ordinal)
- ? path.Substring(1).ToLower(CultureInfo.CurrentUICulture)
+ ? path[1..].ToLower(CultureInfo.CurrentUICulture)
: path.ToLower(CultureInfo.CurrentUICulture);
string[] pieces = cutPath.Split(new[]
diff --git a/Aaru.Filesystems/ISO9660/Info.cs b/Aaru.Filesystems/ISO9660/Info.cs
index 512939782..90aa7bcad 100644
--- a/Aaru.Filesystems/ISO9660/Info.cs
+++ b/Aaru.Filesystems/ISO9660/Info.cs
@@ -180,7 +180,7 @@ public sealed partial class ISO9660
bootSpec = "Unknown";
- if(Encoding.GetString(bvd.Value.system_id).Substring(0, 23) == "EL TORITO SPECIFICATION")
+ if(Encoding.GetString(bvd.Value.system_id)[..23] == "EL TORITO SPECIFICATION")
{
bootSpec = "El Torito";
diff --git a/Aaru.Filesystems/Opera/Dir.cs b/Aaru.Filesystems/Opera/Dir.cs
index 4582f8860..7ac96ebcd 100644
--- a/Aaru.Filesystems/Opera/Dir.cs
+++ b/Aaru.Filesystems/Opera/Dir.cs
@@ -58,7 +58,7 @@ public sealed partial class OperaFS
}
string cutPath = path.StartsWith("/", StringComparison.Ordinal)
- ? path.Substring(1).ToLower(CultureInfo.CurrentUICulture)
+ ? path[1..].ToLower(CultureInfo.CurrentUICulture)
: path.ToLower(CultureInfo.CurrentUICulture);
if(_directoryCache.TryGetValue(cutPath, out Dictionary currentDirectory))
diff --git a/Aaru.Filesystems/Opera/File.cs b/Aaru.Filesystems/Opera/File.cs
index b31ac84e8..014af0c75 100644
--- a/Aaru.Filesystems/Opera/File.cs
+++ b/Aaru.Filesystems/Opera/File.cs
@@ -187,7 +187,7 @@ public sealed partial class OperaFS
entry = null;
string cutPath = path.StartsWith("/", StringComparison.Ordinal)
- ? path.Substring(1).ToLower(CultureInfo.CurrentUICulture)
+ ? path[1..].ToLower(CultureInfo.CurrentUICulture)
: path.ToLower(CultureInfo.CurrentUICulture);
string[] pieces = cutPath.Split(new[]
diff --git a/Aaru.Filesystems/PCFX.cs b/Aaru.Filesystems/PCFX.cs
index 0e3873d70..e3ae19c50 100644
--- a/Aaru.Filesystems/PCFX.cs
+++ b/Aaru.Filesystems/PCFX.cs
@@ -96,7 +96,7 @@ public sealed class PCFX : IFilesystem
try
{
date = Encoding.GetString(header.date);
- var year = int.Parse(date.Substring(0, 4));
+ var year = int.Parse(date[..4]);
var month = int.Parse(date.Substring(4, 2));
var day = int.Parse(date.Substring(6, 2));
dateTime = new DateTime(year, month, day);
diff --git a/Aaru.Filters/BZip2.cs b/Aaru.Filters/BZip2.cs
index c29195c63..2a42f2eba 100644
--- a/Aaru.Filters/BZip2.cs
+++ b/Aaru.Filters/BZip2.cs
@@ -211,10 +211,10 @@ public class BZip2 : IFilter
get
{
if(BasePath?.EndsWith(".bz2", StringComparison.InvariantCultureIgnoreCase) == true)
- return BasePath.Substring(0, BasePath.Length - 4);
+ return BasePath[..^4];
- return BasePath?.EndsWith(".bzip2", StringComparison.InvariantCultureIgnoreCase) == true
- ? BasePath.Substring(0, BasePath.Length - 6) : BasePath;
+ return BasePath?.EndsWith(".bzip2", StringComparison.InvariantCultureIgnoreCase) == true ? BasePath[..^6]
+ : BasePath;
}
}
diff --git a/Aaru.Filters/GZip.cs b/Aaru.Filters/GZip.cs
index 09cffcf4c..8ffc1d186 100644
--- a/Aaru.Filters/GZip.cs
+++ b/Aaru.Filters/GZip.cs
@@ -210,10 +210,10 @@ public sealed class GZip : IFilter
get
{
if(BasePath?.EndsWith(".gz", StringComparison.InvariantCultureIgnoreCase) == true)
- return BasePath.Substring(0, BasePath.Length - 3);
+ return BasePath[..^3];
- return BasePath?.EndsWith(".gzip", StringComparison.InvariantCultureIgnoreCase) == true
- ? BasePath.Substring(0, BasePath.Length - 5) : BasePath;
+ return BasePath?.EndsWith(".gzip", StringComparison.InvariantCultureIgnoreCase) == true ? BasePath[..^5]
+ : BasePath;
}
}
diff --git a/Aaru.Filters/LZip.cs b/Aaru.Filters/LZip.cs
index b7f2ab207..b30c6c861 100644
--- a/Aaru.Filters/LZip.cs
+++ b/Aaru.Filters/LZip.cs
@@ -179,10 +179,10 @@ public sealed class LZip : IFilter
get
{
if(BasePath?.EndsWith(".lz", StringComparison.InvariantCultureIgnoreCase) == true)
- return BasePath.Substring(0, BasePath.Length - 3);
+ return BasePath[..^3];
- return BasePath?.EndsWith(".lzip", StringComparison.InvariantCultureIgnoreCase) == true
- ? BasePath.Substring(0, BasePath.Length - 5) : BasePath;
+ return BasePath?.EndsWith(".lzip", StringComparison.InvariantCultureIgnoreCase) == true ? BasePath[..^5]
+ : BasePath;
}
}
diff --git a/Aaru.Filters/XZ.cs b/Aaru.Filters/XZ.cs
index 5ab9bda39..975ae5982 100644
--- a/Aaru.Filters/XZ.cs
+++ b/Aaru.Filters/XZ.cs
@@ -184,10 +184,10 @@ public sealed class XZ : IFilter
get
{
if(BasePath?.EndsWith(".xz", StringComparison.InvariantCultureIgnoreCase) == true)
- return BasePath.Substring(0, BasePath.Length - 3);
+ return BasePath[..^3];
- return BasePath?.EndsWith(".xzip", StringComparison.InvariantCultureIgnoreCase) == true
- ? BasePath.Substring(0, BasePath.Length - 5) : BasePath;
+ return BasePath?.EndsWith(".xzip", StringComparison.InvariantCultureIgnoreCase) == true ? BasePath[..^5]
+ : BasePath;
}
}
diff --git a/Aaru.Images/ZZZRawImage/Read.cs b/Aaru.Images/ZZZRawImage/Read.cs
index 7e21bb9b9..d42bb00ce 100644
--- a/Aaru.Images/ZZZRawImage/Read.cs
+++ b/Aaru.Images/ZZZRawImage/Read.cs
@@ -377,7 +377,7 @@ public sealed partial class ZZZRawImage
// Search for known tags
string basename = imageFilter.BasePath;
- basename = basename.Substring(0, basename.Length - _extension.Length);
+ basename = basename[..^_extension.Length];
_mediaTags = new Dictionary();
diff --git a/Aaru.Partitions/Plan9.cs b/Aaru.Partitions/Plan9.cs
index db0edfeb6..9e7b651d4 100644
--- a/Aaru.Partitions/Plan9.cs
+++ b/Aaru.Partitions/Plan9.cs
@@ -72,7 +72,7 @@ public sealed class Plan9 : IPartition
// While all of Plan9 is supposedly UTF-8, it uses ASCII strcmp for reading its partition table
string[] really = StringHandlers.CToString(sector).Split('\n');
- foreach(string[] tokens in really.TakeWhile(part => part.Length >= 5 && part.Substring(0, 5) == "part ").
+ foreach(string[] tokens in really.TakeWhile(part => part.Length >= 5 && part[..5] == "part ").
Select(part => part.Split(' ')).TakeWhile(tokens => tokens.Length == 4))
{
if(!ulong.TryParse(tokens[2], out ulong start) ||
diff --git a/Aaru/Commands/Filesystem/Ls.cs b/Aaru/Commands/Filesystem/Ls.cs
index ade13b96c..315fb697d 100644
--- a/Aaru/Commands/Filesystem/Ls.cs
+++ b/Aaru/Commands/Filesystem/Ls.cs
@@ -364,7 +364,7 @@ sealed class LsCommand : Command
List directory = new();
if(path.StartsWith('/'))
- path = path.Substring(1);
+ path = path[1..];
AaruConsole.WriteLine(string.IsNullOrEmpty(path) ? "Root directory" : $"Directory: {Markup.Escape(path)}");