Introduction
I wanted to clear the Skype chat history for a single user, but Skype only allows you to clear the complete chat history, not a single user's contact history.
I searched for 3
rd party tools on the net but nothing worked for me on Windows 7 / Skype 4.1
At the beginning, I knew nothing about how Skype stored chat history and just entered my username and password to login and chat with friends.
After spending a few hours asking Google many questions, I found that Skype was using the following SQLite database to store its messages.
System Drive:\/Skype//main.db
I tried to read it with SQLitespy, but it was a pain to find and clear messages each time. Then, decided to develop a small C# utility to clear a single contact chat history.
Using the Code
First of all, I had to find a method to deal with an SQLite database file using C#. This is where the
System.Data.SQLite
plays a role in my application. You may download it from
http://sqlite.phxsoftware.com/
Reference
System.Data.SQLite.dll (Located in
C:\Program Files\SQLite.NET\bin\System.Data.SQLite.dll) to allow C# to deal with the SQLite database file.
Once I knew I was going to dirty my hands with development, I wanted to find the Skype username(s) to reach to the database file. In System Drive:\
/Skype/ folder, Other than Skype user folder(s), there are 3 folders that Skype use for its operations, “Content”, “My Skype received files” and “Pictures”. I wrote codes to read subfolders and filter-out those 3 Skype standard folders.
Collapse | Copy Code
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);
}
}
The
Usernamecb
variable will be used to populate the dropdown box in the UI.
Based on the selected username we can reach the Skype message database (
main.db) and read chat participants. Chat messages are stored in the "Messages" table.
The following code reads the database and fetches chat participnts (Contacts) who has messages in it.
Collapse | Copy Code
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); participants.DataSource = dt;
participants.ValueMember = "dialog_partner";
Where
participants
is a dropdown box in UI that displays chat participants.
When the user selects the participant from the dropdown box, the following SQL command deletes all messages for a selected participant from the database.
Collapse | Copy Code
cmd = sqlite.CreateCommand();
cmd.CommandText = "delete from Messages Where dialog_partner = '" + participant + "'";
ad = new SQLiteDataAdapter(cmd);
ad.Fill(dt); //execute command
Then I realized that the database file is been locked while Skype is running. Therefore, I added code to terminate the Skype process when the program starts running, and starts up Skype again when the program closes.
Collapse | Copy Code
foreach (Process p in Process.GetProcesses(Environment.MachineName))
{
if (p.ProcessName.Equals("Skype"))
{
p.Kill();
}
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
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){}
}
When all the code comes together, it is a nice and painless tool for clearing a single user's chat history.
Revision (2013/02/18)
1. Updated utility to working with Skype 5.1 and later folder structure while searching skype user accounts
2. Application will automatically remove conversation from recent conversation tab
3. Published setup files for both 32bit and 64 systems