/// <summary> /// PrepareFinalDeleteList processes the final delete list before it can be considered done /// </summary> /// <param name="dataset"></param> /// <returns></returns> public static List <SearchData.DocumentsRow> PrepareFinalDeleteList(ref SearchData dataset) { List <DataRow> _raw_rowsToDelete = new List <DataRow>(dataset.Documents.Where(d => d.Deleted).OrderBy(n => n.FileName)); _raw_rowsToDelete.AddRange(dataset.ExactDuplicate.Where(d => d.Deleted).OrderBy(n => n.FileName)); _raw_rowsToDelete.AddRange(dataset.MultipleVersion.Where(d => d.Deleted).OrderBy(n => n.FileName)); List <SearchData.DocumentsRow> rowsToDelete = new List <SearchData.DocumentsRow>(); foreach (DataRow r in _raw_rowsToDelete) { SearchData.DocumentsRow row = dataset.NewDocumentRow(); row.ID = Convert.ToString(r["ID"]); row.ID_NoVersion = Convert.ToString(r["ID_NoVersion"]); row.FileName = Convert.ToString(r["FileName"]); row.FilePath = Convert.ToString(r["FilePath"]) + @"\" + row.FileName; row.Size = Convert.ToInt64(r["Size"]); row.Deleted = Convert.ToBoolean(r["Deleted"]); row.LastModifiedTime = Convert.ToDateTime(r["LastModifiedTime"]); rowsToDelete.Add(row); dataset.RejectChanges(); } dataset.RejectChanges(); return(rowsToDelete); }
private SearchData SearchDuplicate(string startPath, string extension, bool includeTempFiles, Logger Log) { SearchData data = _searchDuplicate(startPath, extension, includeTempFiles, Log); Log.CloseLog(); for (int i = 0; i < data.Documents.Count; i++) { SearchData.DocumentsRow row = data.Documents[i]; if (data.ExactDuplicate.Any(r => r.ID_NoVersion == row.ID_NoVersion)) { continue; } if (data.MultipleVersion.Any(r => r.ID_NoVersion == row.ID_NoVersion)) { continue; } //remove row if there are no duplicate for this file data.Documents.RemoveDocumentsRow(row); i--; } data.Documents.DefaultView.Sort = "FileName,LastModifiedTime,FilePath"; data.ExactDuplicate.DefaultView.Sort = "FileName,LastModifiedTime,FilePath"; data.MultipleVersion.DefaultView.Sort = "FileName,LastModifiedTime,FilePath"; try { SaveData(TempSaveLocation); } catch (Exception ex) { Log.WriteLog("Exception in SearchDuplicate " + ex.Message); } return(data); }
private void dgFiles_CellClick(object sender, DataGridViewCellEventArgs e) { //Dont allow to select all files at once. if (e.RowIndex < 0) { return; } if (!this.chkAllowMainFiles.Checked) { string fileName = dgFiles.Rows[e.RowIndex].Cells[2].Value.ToString(); ApplyFilter(fileName); } else { if (e.ColumnIndex == 0) { string ID = dgFiles.Rows[e.RowIndex].Cells[1].Value.ToString(); string path = dgFiles.Rows[e.RowIndex].Cells[5].Value.ToString(); SearchData.DocumentsRow row = dataset.Documents.Single(d => d.ID == ID && d.FilePath == path); row.BeginEdit(); if (row.Deleted) { dgFiles.Rows[e.RowIndex].Cells[0].Value.ToString(); dgFiles.Rows[e.RowIndex].Cells[0].Value = row.Deleted = false; } else { dgFiles.Rows[e.RowIndex].Cells[0].Value = row.Deleted = true; } row.EndEdit(); dataset.Documents.AcceptChanges(); UpdateFinalDeleteList(); } } }
/// <summary> /// _searchDuplicate - creates new thread and get the data /// </summary> /// <param name="startPath"></param> /// <param name="extension"></param> /// <param name="includeTempFiles"></param> /// <returns></returns> SearchData _searchDuplicate(string startPath, string extension, bool includeTempFiles, Logger log) { if (QuitNow) { return(searchData); } SendMessage("FileSearcher Starting in " + startPath); IEnumerable <string> directories = new List <string>(); //Enumerate all child directories if (Directory.Exists(startPath)) { directories = Directory.EnumerateDirectories(startPath); if (directories != null && directories.Count <string>() >= 0) { foreach (string directory in directories) { DirectoryInfo di = new DirectoryInfo(directory); if (((di.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden) || ((di.Attributes & FileAttributes.System) == FileAttributes.System) || ((di.Attributes & FileAttributes.Temporary) == FileAttributes.Temporary) && includeTempFiles) { continue; } //IAsyncResult ar = BeginSearcherAsync(directory, extension, includeTempFiles, log, CallbackMethod); SearchData dataInDir = _searchDuplicate(directory, extension, includeTempFiles, log); if (dataInDir != null) { searchData.Merge(dataInDir); } if (QuitNow) { return(searchData); } } } } //Enumerate files in that directory only. IEnumerable <string> files = Directory.EnumerateFiles(startPath, extension, SearchOption.TopDirectoryOnly); //string[] files = Directory.GetFiles(startPath, extension, SearchOption.AllDirectories); SendMessage("Files in " + startPath + " Received."); SendMessage(" Processing files in " + startPath); foreach (string file in files) { //Quit with available result if Cancellation requested if (QuitNow) { return(searchData); } FileInfo fi = new FileInfo(file); if (((fi.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden) || ((fi.Attributes & FileAttributes.System) == FileAttributes.System) || ((fi.Attributes & FileAttributes.Temporary) == FileAttributes.Temporary) && includeTempFiles) { continue; } //To compare we dont need to use file name. //1 # Possible duplicate - Compare = file length and extension and last update time. //2 # Matching different version - Compare = file name and file length and extension //3 # Exact match file name and file length and extension and last update time string rowID = fi.Name + fi.Length.ToString() + fi.Extension; //Search for an exact duplicate if (searchData.Documents.FindByID(rowID + fi.LastWriteTimeUtc.Ticks.ToString()) != null) //log a duplicate file found { SearchData.ExactDuplicateRow counterRow = searchData.ExactDuplicate.NewExactDuplicateRow(); counterRow.FileName = fi.Name; counterRow.ID = rowID; counterRow.ID_NoVersion = rowID; counterRow.FilePath = fi.DirectoryName; counterRow.LastModifiedTime = fi.LastWriteTimeUtc; counterRow.Size = fi.Length / 1024; if (searchData.ExactDuplicate.FindByIDFilePath(counterRow.ID, counterRow.FilePath) == null) { searchData.ExactDuplicate.AddExactDuplicateRow(counterRow); } } //Search for another version(Not an exact duplicate version) else if (searchData.Documents.FindByID(rowID) != null && searchData.Documents.Any(r => r.ID.StartsWith(rowID))) { SearchData.MultipleVersionRow multipleVersionRow = searchData.MultipleVersion.NewMultipleVersionRow(); multipleVersionRow.FileName = fi.Name; multipleVersionRow.ID_NoVersion = rowID; multipleVersionRow.ID = rowID + fi.LastWriteTimeUtc.Ticks.ToString(); multipleVersionRow.FilePath = fi.DirectoryName; multipleVersionRow.LastModifiedTime = fi.LastWriteTimeUtc; multipleVersionRow.Size = fi.Length / 1024; searchData.MultipleVersion.AddMultipleVersionRow(multipleVersionRow); } else// This file is not yet in the list { SearchData.DocumentsRow row = searchData.Documents.NewDocumentsRow(); row.LastModifiedTime = fi.LastWriteTimeUtc; row.ID_NoVersion = rowID; row.ID = rowID + fi.LastWriteTimeUtc.Ticks.ToString(); row.FileName = fi.Name; row.Size = fi.Length / 1024; row.FilePath = fi.DirectoryName; searchData.Documents.AddDocumentsRow(row); } searchData.AcceptChanges(); } SendMessage("processing complete " + startPath + "... now saving"); return(searchData); }