65.9K
CodeProject 正在变化。 阅读更多。
Home

删除单个联系人的 Skype 聊天记录

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.63/5 (20投票s)

2010 年 1 月 6 日

CPOL

2分钟阅读

viewsIcon

282331

downloadIcon

23884

一个小型的 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 位系统的安装文件

 

© . All rights reserved.