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)}");