永不停止学习
Source: Dev.to
请提供您希望翻译的正文内容,我将为您翻译成简体中文并保持原有的格式。
介绍
现在是开发者的黄金时代,拥有丰富的工具、文档和人工智能。尽管如此,至少在可预见的未来,开发者仍需学习编写代码,因为 AI 工具并不完美,可能会生成难以集成到现有代码库的代码。
- 对于刚入门的开发者 – 先学习基础知识,然后是面向对象编程和数据库工作。
- 对于有经验的开发者 – 打磨技能,以获得并保持全职工作。例如,C# .NET Core 有了新特性;抽时间学习它,即使暂时没有直接用处。另一条路径是浏览开发者论坛,分析问题的各个方面,决定可以学习或避免的内容。
以下指南适用于使用 Microsoft Visual Studio、C# 和 .NET 8 或更高版本 的开发者。
- 为学习创建一个 Visual Studio 解决方案,并使用 解决方案文件夹 对主题进行分类。
- 当代码在多个项目中都有用时,将其放入 类库(请参见下图中的类项目文件夹)。
请求控制台项目的登录
首先,完整查看该线程——这正是 AI 可能用来形成响应的全部内容。
现在让我们使用 Spectre.Console NuGet 包来探索一种更好的方式。
Spectre.ConsoleTextPrompt可提示用户输入文本,并支持验证、默认值以及密码遮蔽。- 它将用于确保返回 非空字符串。
- 密码文本会被遮蔽。
- 用户名和密码使用相同的颜色。
- 示例包含足够的验证以用于测试(硬编码)。
using Spectre.Console;
using SpectreLoginSample.Classes.Core;
namespace SpectreLoginSample.Classes;
internal class Prompts
{
public static string PromptStyleColor { get; set; } = "cyan";
public static string PromptColor { get; set; } = "bold";
public static bool TryLogin(int maxAttempts = 3)
{
for (int attempt = 1; attempt
username == "admin" && password == "password";
public static string GetUserName(bool allowEmpty) =>
allowEmpty
? AnsiConsole.Prompt(
new TextPrompt($"[{PromptColor}]User name[/]")
.PromptStyle(PromptStyleColor)
.AllowEmpty())
: AnsiConsole.Prompt(
new TextPrompt($"[{PromptColor}]User name[/]:")
.PromptStyle(PromptStyleColor));
public static string GetPassword() =>
AnsiConsole.Prompt(
new TextPrompt($"[{PromptColor}]Password[/]:")
.PromptStyle("grey50")
.Secret()
.DefaultValueStyle(new Style(Color.Aqua)));
}
为什么这是一次很好的学习体验
登录代码完成后,Spectre.Console 库还有大量内容可供探索。它在以下方面表现出色:
- .NET 工具
- 控制台项目实用程序
文件通配符来救场
文件通配符是每个开发者都应该了解的话题。glob(通配符)使用通配符定义匹配文件和目录名称的模式。通配符操作就是定义一个或多个 glob 模式,并根据包含或排除的匹配结果返回文件。
场景 – 开发者使用 OneDrive 进行备份。备份完成后,所有本地文件都会被删除。当恢复备份时,会出现大量重复文件(5,000+ 副本)。手动删除这些文件几乎不可能。掌握文件通配符后,开发者可以编写一个简单的控制台应用程序,自动删除这些重复文件。
创建重复文件列表的代码
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Extensions.FileSystemGlobbing;
using Spectre.Console;
public static class Globbing
{
///
/// Returns a list of files that match typical “Copy” naming patterns.
///
public static async Task> GetDuplicatesTask(string parentFolder)
{
var list = new List();
var matcher = new Matcher();
// Include typical copy‑file patterns
matcher.AddIncludePatterns(new[]
{
"**/* - Copy .*",
"**/* - Copy (*.*"
});
// Exclude folders that may need special permissions
matcher.AddExcludePatterns(new[]
{
"**/My Music/**",
"**/My Pictures/**",
"**/My Videos/**"
});
await Task.Run(() =>
{
foreach (var file in matcher.GetResultsInFullPath(parentFolder))
{
list.Add(new FileMatchItem(file));
}
});
// Persist the list for later inspection
await File.WriteAllLinesAsync(
Path.Combine(parentFolder, "Duplicates.txt"),
list.Select(item => item.ToString()));
return list;
}
}
删除重复文件的代码
using System;
using System.Threading.Tasks;
using Spectre.Console;
public static class DuplicateProcessor
{
public static async Task ProcessOneDriveDuplicates()
{
var folder = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
var list = await Globbing.GetDuplicatesTask(folder);
if (list.Count > 0)
{
AnsiConsole.MarkupLine($"[bold green]Found {list.Count} duplicate files.[/]");
foreach (var item in list)
{
try
{
System.IO.File.Delete(item.FullPath);
}
catch (Exception ex)
{
AnsiConsole.MarkupLine(
$"[red]Failed to delete {item.FullPath}: {ex.Message}[/]");
}
}
AnsiConsole.MarkupLine("[bold green]Deletion complete.[/]");
}
else
{
AnsiConsole.MarkupLine("[green]No duplicate files were found.[/]");
}
SpectreConsoleHelpers.ContinuePrompt();
}
}
💡 小贴士 –
AddExcludePatterns对于跳过需要提升权限的目录或你根本不想触碰的目录非常有用。
摘要
- 使用 Spectre.Console 实现精致、交互式的控制台提示(登录、菜单等)。
- 利用 file‑globbing (
Microsoft.Extensions.FileSystemGlobbing) 根据模式定位并操作文件组。 - 在 Visual Studio 解决方案中将可复用代码组织在类库项目中,以保持整洁并可在多个控制台应用之间共享。
祝编码愉快!
源代码
files.[/]");
} else
{
AnsiConsole.MarkupLine($"[bold green]No duplicate files found in {folder}.[/]");
return;
}
foreach (var (index, item) in list.Index())
{
try
{
if (File.Exists(item.FullName))
{
File.Delete(item.FullName);
}
else
{
AnsiConsole.MarkupLine($"[yellow bold]{item.FullName}[/]");
}
}
catch (Exception e)
{
AnsiConsole.MarkupLine($"[red bold]Failed to delete " +
$"{index} {item.FullName}[/]");
}
}
摘要
无论开发者是沉浸于代码、在遇到卡点时使用人工智能,还是不使用 AI,都应该每周至少尝试学习一点新东西。Karen 每周会尝试学习几次新东西。