删除单个联系人的 Skype 聊天记录
一个小型的 C# 实用程序,用于清除单个联系人的聊天记录,因为 Skype 默认只删除完整的聊天记录。

引言
我想清除单个用户的 Skype 聊天记录,但 Skype 仅允许您清除完整的聊天记录,而不是单个用户的联系人记录。
我在网上搜索了第三方工具,但它们在 Windows 7 / Skype 4.1 上对我不起作用
一开始,我不知道 Skype 如何存储聊天记录,只是输入了我的用户名和密码来登录并与朋友聊天。
在花几个小时向 Google 提问后,我发现 Skype 使用以下 SQLite 数据库来存储其消息。
系统驱动器:\<当前用户的应用程序数据文件夹>/Skype/<Skype 用户名>/main.db
我尝试用 SQLitespy 读取它,但每次查找和清除消息都很痛苦。然后,我决定开发一个小型的 C# 实用程序来清除单个联系人的聊天记录。
Using the Code
首先,我必须找到一种使用 C# 处理 SQLite 数据库文件的方法。这就是 System.Data.SQLite
在我的应用程序中发挥作用的地方。您可以从 http://sqlite.phxsoftware.com/ 下载它
引用 System.Data.SQLite.dll (位于 C:\Program Files\SQLite.NET\bin\System.Data.SQLite.dll) 以允许 C# 处理 SQLite 数据库文件。
一旦我知道我将开始开发,我就想找到 Skype 用户名来访问数据库文件。在系统驱动器:\<当前用户的应用程序数据文件夹>/Skype/ 文件夹中,除了 Skype 用户文件夹外,还有 3 个 Skype 用于其操作的文件夹,“内容”、“我的 Skype 接收到的文件”和“图片”。我编写了代码来读取子文件夹并过滤掉这 3 个 Skype 标准文件夹。
String sDirName = Environment.GetEnvironmentVariable("APPDATA") + @"\Skype"; String [] folders = Directory.GetDirectories(sDirName); String[] names = new String[folders.Length-3]; foreach (String fname in folders){ String folder = fname.Replace(Environment.GetEnvironmentVariable("APPDATA") + @"\Skype\", ""); if (folder != "Content" && folder != "My Skype Received Files" && folder != "Pictures") { usernamecb.Items.Add(folder); } }
Usernamecb
变量将用于填充 UI 中的下拉框。
根据选定的用户名,我们可以访问 Skype 消息数据库 (main.db) 并读取聊天参与者。聊天消息存储在“Messages”表中。
以下代码读取数据库并获取其中包含消息的聊天参与者(联系人)。
database = Environment.GetEnvironmentVariable("APPDATA") + @"\Skype\" + SkypeUserName +
@"\main.db";
SQLiteConnection sqlite = new SQLiteConnection("data source=" + database);
SQLiteDataAdapter ad;
DataTable dt = new DataTable();
SQLiteCommand cmd;
sqlite.Open();
cmd = sqlite.CreateCommand();
cmd.CommandText = "select DISTINCT dialog_partner from Messages";
ad = new SQLiteDataAdapter(cmd);
ad.Fill(dt); //execute command
participants.DataSource = dt;
participants.ValueMember = "dialog_partner";
其中 participants
是 UI 中的一个下拉框,用于显示聊天参与者。
当用户从下拉框中选择参与者时,以下 SQL 命令将删除所选参与者在数据库中的所有消息。
cmd = sqlite.CreateCommand();
cmd.CommandText = "delete from Messages Where dialog_partner = '" + participant + "'";
ad = new SQLiteDataAdapter(cmd);
ad.Fill(dt); //execute command
然后我意识到当 Skype 运行时,数据库文件被锁定。因此,我添加了代码以在程序开始运行时终止 Skype 进程,并在程序关闭时再次启动 Skype。
// Terminate Skype
foreach (Process p in Process.GetProcesses(Environment.MachineName))
{
if (p.ProcessName.Equals("Skype"))
{
p.Kill();
}
}
//Start Skype when the programe is exiting
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
// open Skype again
String program = Environment.GetEnvironmentVariable("ProgramFiles");
try
{
System.Diagnostics.ProcessStartInfo psi =
new System.Diagnostics.ProcessStartInfo(program + @"\Skype\Phone\Skype.exe");
System.Diagnostics.Process.Start(psi);
}
catch (Exception ex){}
}
当所有代码组合在一起时,它是一个用于清除单个用户聊天记录的不错且无痛的工具。
修订版 (2013/02/18)
1. 更新实用程序以使用 Skype 5.1 及更高版本的文件夹结构,同时搜索 skype 用户帐户
2. 应用程序将自动从最近的会话选项卡中删除会话
3. 发布了 32 位和 64 位系统的安装文件