背景介绍
在日常学习和工作中,我们常常需要记录各种信息,例如会议纪要、灵感想法、密码等。这些信息可能包含敏感内容,因此需要一种安全的方式来保存和管理。本文将介绍如何使用C#和Windows Forms(WinForms)开发一个轻量级的加密笔记管理器,帮助用户安全地记录和管理笔记内容。
该项目具备创建、保存、删除笔记的基本功能,并引入了凯撒密码(Caesar Cipher)作为内容加密方式。通过本项目,开发者可以学习到GUI设计、事件处理、文件操作以及简单加密算法的实现,适合中级以下开发者进行学习和实践。
思路分析
本项目的核心目标是构建一个图形界面的笔记管理器,用户可以:
- 新建笔记:清空标题和内容,准备创建新笔记。
- 保存笔记:验证标题,使用凯撒密码加密内容并保存为
.txt文件。 - 删除笔记:如果是私密笔记,需要输入密码验证后才能删除。
- 加密功能:使用凯撒密码(位移3)对内容和密码进行加密。
- 文件管理:自动创建存储目录,遍历并加载所有
.txt格式的笔记文件。
技术点解析
- GUI设计与布局:使用
SplitContainer、TextBox、ListBox等控件构建界面。 - 事件驱动编程:绑定按钮点击事件和列表项选择事件。
- 文件读写与数据处理:读取和写入本地文件,处理文件路径。
- 简单加密算法实现:实现凯撒密码加密和解密逻辑。
代码实现(C# + WinForms)
以下是一个完整的实现代码,包含核心功能和详细注释说明:
using System;
using System.IO;
using System.Linq;
using System.Windows.Forms;
namespace EncryptedNoteApp
{
public partial class Form1 : Form
{
// 存储笔记的目录
private readonly string notesDirectory = Path.Combine(Application.StartupPath, "notes");
// 界面控件
private ListBox lstNotes;
private TextBox txtTitle;
private TextBox txtContent;
private Button btnNew;
private Button btnSave;
private Button btnDelete;
private CheckBox chkPrivate;
public Form1()
{
InitializeComponent();
InitializeUI();
Directory.CreateDirectory(notesDirectory); // 确保目录存在
LoadNotes(); // 加载已有笔记
}
private void InitializeUI()
{
// 创建控件
lstNotes = new ListBox { Dock = DockStyle.Fill };
txtTitle = new TextBox { Location = new Point(10, 10), Width = 300 };
txtContent = new TextBox
{
Multiline = true,
Location = new Point(10, 40),
Width = 300,
Height = 200
};
btnNew = new Button { Text = "新建", Location = new Point(10, 250), Width = 75 };
btnSave = new Button { Text = "保存", Location = new Point(90, 250), Width = 75 };
btnDelete = new Button { Text = "删除", Location = new Point(170, 250), Width = 75 };
chkPrivate = new CheckBox { Text = "私密", Location = new Point(10, 290) };
// 事件绑定
btnNew.Click += btnNew_Click;
btnSave.Click += btnSave_Click;
btnDelete.Click += btnDelete_Click;
lstNotes.SelectedIndexChanged += lstNotes_SelectedIndexChanged;
// 布局
var splitContainer = new SplitContainer
{
Dock = DockStyle.Fill,
SplitterDistance = 200
};
splitContainer.Panel1.Controls.Add(lstNotes);
splitContainer.Panel2.Controls.Add(txtTitle);
splitContainer.Panel2.Controls.Add(txtContent);
splitContainer.Panel2.Controls.Add(btnNew);
splitContainer.Panel2.Controls.Add(btnSave);
splitContainer.Panel2.Controls.Add(btnDelete);
splitContainer.Panel2.Controls.Add(chkPrivate);
Controls.Add(splitContainer);
Text = "加密笔记管理器";
ClientSize = new Size(800, 500);
}
// 加载所有笔记文件
private void LoadNotes()
{
lstNotes.Items.Clear();
foreach (var file in Directory.GetFiles(notesDirectory, "*.txt"))
{
lstNotes.Items.Add(Path.GetFileName(file));
}
}
// 当列表项被选中时加载笔记内容
private void lstNotes_SelectedIndexChanged(object sender, EventArgs e)
{
if (lstNotes.SelectedItem == null) return;
var fileName = lstNotes.SelectedItem.ToString();
var filePath = Path.Combine(notesDirectory, fileName);
try
{
var lines = File.ReadAllLines(filePath);
if (lines.Length < 1)
{
MessageBox.Show("无效的笔记格式");
return;
}
var header = lines[0];
var encryptedContent = string.Join("\n", lines.Skip(1));
if (header.StartsWith("PRIVATE:"))
{
var encryptedPassword = header.Substring(8);
var password = InputBox.Show("请输入密码", "密码验证");
if (string.IsNullOrEmpty(password)) return;
if (DecryptText(encryptedPassword) != password)
{
MessageBox.Show("密码错误");
return;
}
}
txtTitle.Text = Path.GetFileNameWithoutExtension(fileName).Replace("_", " ");
txtContent.Text = DecryptText(encryptedContent);
chkPrivate.Checked = header.StartsWith("PRIVATE:");
}
catch (Exception ex)
{
MessageBox.Show("加载笔记时出错:" + ex.Message);
}
}
// 新建笔记
private void btnNew_Click(object sender, EventArgs e)
{
txtTitle.Clear();
txtContent.Clear();
lstNotes.ClearSelected();
chkPrivate.Checked = false;
}
// 保存笔记
private void btnSave_Click(object sender, EventArgs e)
{
var title = txtTitle.Text.Trim();
if (string.IsNullOrEmpty(title))
{
MessageBox.Show("请输入标题");
return;
}
var content = txtContent.Text;
var encryptedContent = EncryptText(content);
var fileName = $"{SanitizeFileName(title)}.txt";
var filePath = Path.Combine(notesDirectory, fileName);
try
{
using (var writer = new StreamWriter(filePath))
{
if (chkPrivate.Checked)
{
var password = InputBox.Show("请输入密码", "设置私密笔记");
if (string.IsNullOrEmpty(password))
return;
writer.WriteLine($"PRIVATE:{EncryptText(password)}");
}
else
{
writer.WriteLine("PUBLIC");
}
writer.WriteLine(encryptedContent);
}
LoadNotes();
MessageBox.Show("笔记已保存");
}
catch (Exception ex)
{
MessageBox.Show("保存笔记时出错:" + ex.Message);
}
}
// 删除笔记
private void btnDelete_Click(object sender, EventArgs e)
{
if (lstNotes.SelectedItem == null)
{
MessageBox.Show("请选择一个笔记");
return;
}
var fileName = lstNotes.SelectedItem.ToString();
var filePath = Path.Combine(notesDirectory, fileName);
var lines = File.ReadAllLines(filePath);
var header = lines[0];
if (header.StartsWith("PRIVATE:"))
{
var encryptedPassword = header.Substring(8);
var password = InputBox.Show("请输入密码", "验证删除权限");
if (string.IsNullOrEmpty(password) || DecryptText(encryptedPassword) != password)
{
MessageBox.Show("密码错误,无法删除");
return;
}
}
try
{
File.Delete(filePath);
LoadNotes();
MessageBox.Show("笔记已删除");
}
catch (Exception ex)
{
MessageBox.Show("删除笔记时出错:" + ex.Message);
}
}
// 清理文件名中的非法字符
private string SanitizeFileName(string name)
{
return name.Replace(" ", "_").Replace("\\", "").Replace("/", "").Replace(":", "");
}
// 凯撒密码加密(位移3)
private string EncryptText(string text)
{
return string.Concat(text.Select(c =>
{
if (char.IsLetter(c))
{
var baseChar = char.IsUpper(c) ? 'A' : 'a';
return (char)((((c + 3) - baseChar) % 26) + baseChar);
}
return c;
}));
}
// 凯撒密码解密(位移3)
private string DecryptText(string text)
{
return string.Concat(text.Select(c =>
{
if (char.IsLetter(c))
{
var baseChar = char.IsUpper(c) ? 'A' : 'a';
return (char)((((c - 3) - baseChar + 26) % 26) + baseChar);
}
return c;
}));
}
}
// 自定义输入框类
public static class InputBox
{
public static string Show(string prompt, string title)
{
var form = new Form
{
Width = 300,
Height = 150,
Text = title,
StartPosition = FormStartPosition.CenterScreen
};
var label = new Label { Left = 20, Top = 20, Width = 260, Text = prompt };
var textBox = new TextBox { Left = 20, Top = 50, Width = 260 };
var buttonOk = new Button
{
Text = "确定",
Left = 100,
Top = 90,
DialogResult = DialogResult.OK
};
var buttonCancel = new Button
{
Text = "取消",
Left = 180,
Top = 90,
DialogResult = DialogResult.Cancel
};
form.Controls.Add(label);
form.Controls.Add(textBox);
form.Controls.Add(buttonOk);
form.Controls.Add(buttonCancel);
form.AcceptButton = buttonOk;
form.CancelButton = buttonCancel;
if (form.ShowDialog() == DialogResult.OK)
return textBox.Text;
return null;
}
}
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}
项目总结
本项目实现了一个基于WinForms的加密笔记管理器,具备以下特点:
- 简单易用:界面清晰,操作直观,适合快速上手。
- 安全性:支持私密笔记和密码保护,使用凯撒密码进行内容加密。
- 本地化存储:所有数据保存在本地目录,无需联网或依赖外部服务。
- 学习价值:涵盖了GUI设计、事件处理、文件操作和简单加密算法的实现,适合中级以下开发者学习。
扩展建议
为了进一步提升项目的功能和实用性,可以考虑以下扩展方向:
- 增加笔记分类:为笔记添加标签或分类,便于管理。
- 支持多种加密方式:如AES加密,提高安全性。
- 增加搜索功能:通过标题或内容关键词快速查找笔记。
- 支持导出和备份:将笔记打包为压缩文件,方便备份。
- 增加笔记编辑功能:允许用户修改已保存的笔记内容。
- 支持多语言切换:为用户提供中英文切换选项。
通过本项目,你可以深入理解C# WinForms的开发流程,并掌握如何在实际应用中集成加密功能。这不仅是一个实用的工具,更是学习Windows桌面应用开发和数据安全处理的良好起点。