/// <summary> /// Löscht doppelte Einträge sowhol aus der Datenbank, wie auch vom Filesystem. /// Eine Sicherheitskopie der Dateien wird angelegt, wenn das backupDirectory angegeben wurde. /// Die Auswahl der Duplikate erfolgt über eine Sortierung. /// Nach der Ermittlung der doppelten Einträge, bleibt der 1. Eintrag erhalten und alle anderen werden gelöscht. /// </summary> /// <param name="priority"> /// Eine zusätzlliche Prioritätensteuerung zur uche nach doppelten Einträgen /// </param> /// <param name="backupDirectory"> /// Der Pfad zum Backup-Directory für die gelöschten Dateien /// </param> /// <returns> /// Eine Liste der gelöschten Dateien /// </returns> public IEnumerable<WDuplicateEntry> DeleteEnries(EDuplicateCheckPriority priority, string backupDirectory) { IEnumerable<WDuplicateEntry> duplicateEntries = ReadMultiEntries(priority); WDuplicateEntry savedEntry = null; List<WDuplicateEntry> deletedFiles = new List<WDuplicateEntry>(); foreach (WDuplicateEntry curEntry in duplicateEntries) { if (savedEntry != null && savedEntry.Interpret == curEntry.Interpret && savedEntry.Album == curEntry.Album && savedEntry.Name == curEntry.Name) { deletedFiles.Add(curEntry); DeleteEntry(curEntry.TitleId); FileMgr.Instance.CopyFile(curEntry.Path, curEntry.Filename, backupDirectory); FileMgr.Instance.DeleteFile(curEntry.Path, curEntry.Filename); } else { savedEntry = curEntry; } } return deletedFiles; }
/// <summary> /// Liefert die Datenbankeinträge, welche doppelte Einträge sind /// </summary> /// <returns></returns> protected IEnumerable<WDuplicateEntry> ReadMultiEntries(EDuplicateCheckPriority priority) { string query = "SELECT i.Name, a.Name, title1.Name, title1.Path, title1.Filename, title1.bitrate, title1.Length, title1.bytes, title1.ID from Title title1 " + "JOIN Title title2 on title1.ID != title2.ID " + "JOIN Interpret i on i.ID = title1.Interpret_ID " + "LEFT JOIN Album a on a.ID = title1.Album_ID " + "WHERE title1.Interpret_ID = title2.Interpret_ID " + "AND (title1.Album_ID = title2.Album_ID OR title1.Album_ID is null) " + "AND title1.Name = title2.Name " + "ORDER BY title1.Interpret_ID, title1.Album_ID, title1.Name "; if (priority == EDuplicateCheckPriority.CREATIONDATE) { query += ", title1.Editdate "; } query += ", title1.bitrate, title1.Duration, title1.bytes"; SqlCeConnection connection = new SqlCeConnection(global::MP3ManagerBase.Properties.Settings.Default.MP3ManagerConnection); connection.Open(); List<WDuplicateEntry> returnValue = new List<WDuplicateEntry>(); try { using (SqlCeCommand cmd = new SqlCeCommand(query, connection)) { SqlCeDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { WDuplicateEntry newEntry = new WDuplicateEntry(); newEntry.Interpret = !reader.IsDBNull(0) ? reader.GetSqlString(0).Value : ""; newEntry.Album = !reader.IsDBNull(1) ? reader.GetSqlString(1).Value : ""; newEntry.Name = !reader.IsDBNull(2) ? reader.GetSqlString(2).Value : ""; newEntry.Path = !reader.IsDBNull(3) ? reader.GetSqlString(3).Value : ""; newEntry.Filename = !reader.IsDBNull(4) ? reader.GetSqlString(4).Value : ""; newEntry.Bitrate = !reader.IsDBNull(5) ? reader.GetSqlInt32(5).Value : 0; newEntry.Length = !reader.IsDBNull(6) ? reader.GetSqlString(6).Value : ""; newEntry.Bytes = !reader.IsDBNull(7) ? reader.GetSqlInt64(7).Value : 0; newEntry.TitleId = !reader.IsDBNull(8) ? reader.GetSqlInt32(8).Value : 0; returnValue.Add(newEntry); log.DebugFormat("DuplicatEntry: {0}", newEntry.ToString()); } reader.Close(); } } catch (Exception) { throw; } finally { connection.Close(); } return returnValue; }