async Task findDupesInDbAndDeleteThemFromFS_SUSPENDED(string mainFolder, int mainRootLen, string dupeFolder, int dupeRootLen, long minSz)
        {
            InfoMsg = "F2: ...";
            synth.SpeakAsync($"F2: Removing dupes from the specified dupe folder {dupeFolder}");
            synth.Speak("F2 suspended for now.");
            return;//  throw new Exception("SUSPENDED: ");

            _TtlBytesDeleted = _TotalAdded = _TotalRenamed = _TotalDeleted = _TotalUpdated = _TotalHashed = 0;
            using (var db = new A0DbContext())
            {
                try
                {
                    var sw = Stopwatch.StartNew();

                    getAddAuditId(dupeFolder.Substring(mainRootLen < dupeFolder.Length ? mainRootLen : 0), db);

                    using (var ha = SHA256Managed.Create()) //_md5 = MD5.Create(),		//  3.5/4.5 faster than SHA256/SHA512			//_sh5 = SHA512Managed.Create(),				//  128 char len					//   64 char len. 3/4 ~ SHA256/SHA512
                    {
                        var delCandidates = FileIO.getFileInfosAsync(dupeFolder).Result.ToList().Where(r => r.Length > minSz).OrderByDescending(r => r.Length);
                        _ah.TotalFound    = delCandidates.Count();
                        TtlLen            = delCandidates.Select(r => r.Length).Sum();
                        PrgLen            = 0L;
                        var idx           = 0L;

                        foreach (var delCandidate in delCandidates.OrderByDescending(r => r.Length))
                        //Parallel.ForEach(delCandidates,
                        //delCandidates.ToList().ForEach(
                        //  async delCandidate =>
                        {
                            PrgLen = await makeSureItIsDupeNadSafeDelete(delCandidate, mainFolder, mainRootLen, dupeFolder, dupeRootLen, db, sw, ha, TtlLen, PrgLen); //

                            Interlocked.Increment(ref idx);
                            lock (_thisLock) { if ((idx) % _dbPackLen == 0)
                                               {
                                                   SaveRpt += Environment.NewLine + db.TrySaveReport($"saved; ttl {idx}");
                                               }
                            }
                        }
                        //);
                    }

                    SaveRpt += Environment.NewLine + db.GetDbChangesReport(5);
                    SaveRpt += Environment.NewLine + db.TrySaveReport("r/s saved");
                }
                catch (Exception ex) { ex.Log(); ErrorMsg = ex.Message; throw; }
                finally
                {
                    updateNewAuditHistRow(_ah.AuditTimeID, "UnDuping from " + dupeFolder);
                }
            }

            synth.Speak("F2 Done.");
        }
Exemple #2
0
        private static async Task getUpdateSaveMediaDuration(A0DbContext _db, string file, DnLd dr)
        {
            var approximationBySize = (dr.CastFileLength ?? (dr.CastFileLength = new FileInfo(file).Length)) / 1000000;

            if (dr.DurationMin == null ||
                dr.DurationMin.Value < approximationBySize * 0.3 ||
                dr.DurationMin.Value > approximationBySize * 3.0 ||
                dr.DurationMin.Value == ConstHelper.Unknown4004Duration)
            {
                dr.DurationMin = await GetMediaDurationInMinUsingMediaElement(file);

                if (dr.DurationMin == null ||
                    dr.DurationMin.Value < approximationBySize * 0.3 ||
                    dr.DurationMin.Value > approximationBySize * 3.0 ||
                    dr.DurationMin.Value == ConstHelper.Unknown4004Duration)
                {
                    dr.DurationMin = approximationBySize;
                }

                if (_db != null)
                {
                    _db.TrySaveReport();
                }
            }

            Debug.Write($"Final: {dr.DurationMin,5:N1}, approx: {approximationBySize,5:N1}, {dr.CastTitle}\n");
        }
        async Task HashFolder_OLD(string folder, bool isMasterish)
        {
            InfoMsg = "F1: ...";
            //..synth.SpeakAsync($"Hashing the specified  {isMasterish} master folder.");

            _TtlBytesDeleted = _TotalAdded = _TotalRenamed = _TotalDeleted = _TotalUpdated = _TotalHashed = 0;
            using (var db = new A0DbContext())
            {
                try
                {
                    var sw = Stopwatch.StartNew();

                    getAddAuditId(folder, db);

                    using (var ha = SHA256Managed.Create()) //_md5 = MD5.Create(),		//  3.5/4.5 faster than SHA256/SHA512			//_sh5 = SHA512Managed.Create(),				//  128 char len					//   64 char len. 3/4 ~ SHA256/SHA512
                    {
                        var fis = await FileIO.getFileInfosAsync(folder);

                        _ah.TotalFound = fis.Count();
                        TtlLen         = fis.Select(r => r.Length).Sum();
                        PrgLen         = 0L;
                        var idx        = 0L;

                        //..synth.SpeakAsync($"{fis.Length} files found in the specified {isMasterish} master folder.");

#if ___
#if __
                        Parallel.ForEach(fis.ToList(),
#else
                        fis.ToList().ForEach(
#endif
                                         async fi => idx = await doFile(folder, isMasterish, db, sw, ha, idx, fi));
#else
                        foreach (var fi in fis)
                        {
                            idx = await doFile_OLD(folder, isMasterish, db, sw, ha, idx, fi);
                        }
#endif
                    }

                    SaveRpt += Environment.NewLine + db.GetDbChangesReport(5);
                    SaveRpt += Environment.NewLine + db.TrySaveReport("r/s saved");
                }
                catch (Exception ex) { ex.Log(); ErrorMsg = ex.Message; throw; }
                finally { updateNewAuditHistRow(_ah.AuditTimeID, "Ini scan into DB"); }
            }

            synth.Speak("Hashing is done.");
        }
        async Task UpdateDBfromFS(int v)
        {
            await Task.Delay(9);

            InfoMsg = "F7: ...";
            synth.SpeakAsync("F7: Updating DB with deletes from file system.");

            _TtlBytesDeleted = _TotalAdded = _TotalRenamed = _TotalDeleted = _TotalUpdated = _TotalHashed = 0;
            try
            {
                using (var db = new A0DbContext())
                {
                    getAddAuditId("DB <== FS", db);

                    //var oneDrBase = Path.GetFullPath(CurrentFolder).Substring(0, MasterSubBaseLen);

                    //Trace.WriteLine(db.FileDetails.Where(r => string.IsNullOrEmpty(r.Note) || !r.Note.Contains(_nfo)).ToString(), "SQL");
                    //var nonDelLst = db.FileDetails.Where(r => string.IsNullOrEmpty(r.Note) || !r.Note.Contains(_nfo)).ToList();
                    //InfoMsg = $"F7: {db.FileDetails.ToList().Count():N0} total, {nonDelLst.Count():N0} non-deleted rows in db.";
                    //await Task.Delay(9);
                    //TtlLen = nonDelLst.Count();
                    //PrgLen = 0;
                    //foreach (var fd in nonDelLst)
                    //{
                    //  PrgLen++;

                    //  var fdFullPathName = Path.Combine(oneDrBase, fd.FilePath.StartsWith(@"\") ? fd.FilePath.Substring(1) : fd.FilePath);
                    //  if (!File.Exists(fdFullPathName))
                    //  {
                    //    smartUpdateNote(fd, $"{_nfo} {_ah.AuditTimeID:yyyy-MM-dd HH:mm}>\r\n");
                    //    _TotalUpdated++;
                    //  }
                    //}

                    SaveRpt += Environment.NewLine + db.GetDbChangesReport(5);

#if !DEBUG
                    SaveRpt += Environment.NewLine + db.TrySaveReport("r/s saved");
#endif
                }
            }
            catch (Exception ex) { ex.Log(); ErrorMsg = ex.Message; throw; }
            finally
            {
                updateNewAuditHistRow(_ah.AuditTimeID, "F7: DB <== FS " + SaveRpt);
                synth.Speak("F7 Done.");
            }
        }
        async Task <long> fastSyncFStoDbSansHashing_File(string folder, bool isMasterish, A0DbContext db, Stopwatch sw, SHA256 ha, long idx, FileInfo fi)
        {
            var pl = await addOrUpdateToDb_SansHash(folder, db, sw, ha, TtlLen, PrgLen, fi, isMasterish);

            lock (_thisLock)
            {
                PrgLen = pl;
                Interlocked.Increment(ref idx);
                if ((idx) % _dbPackLen == 0)
                {
                    SaveRpt += Environment.NewLine + db.TrySaveReport($" {idx:N0}").report;
                }
            }

            return(idx);
        }
        //Oct 2017
        async Task delSameNameSizeFromCameraRoll_F12(string folder, bool useSize)
        {
            const int d = -64;
            var       i = 0;

            try
            {
                using (var db = new A0DbContext())
                {
                    var fis = new DirectoryInfo(folder).GetFiles("*.*", SearchOption.AllDirectories);
                    var msg = $"{fis.Length} files {fis.Sum(r => r.Length) / 1e9:N1} gb in {folder}";
                    SaveRpt += Environment.NewLine + msg;
                    Trace.WriteLine($"\r\n**>> {msg}:");
                    foreach (var fi in fis)
                    {
                        var dupe = db.FileDetails.FirstOrDefault(r => r.FileName.Equals(fi.Name, StringComparison.OrdinalIgnoreCase) && (useSize ? r.FileSize == fi.Length : true) && r.FilePath.Equals(fi.DirectoryName, StringComparison.OrdinalIgnoreCase));
                        var mstr = db.FileDetails.FirstOrDefault(r => r.FileName.Equals(fi.Name, StringComparison.OrdinalIgnoreCase) && (useSize ? r.FileSize == fi.Length : true) && !r.FilePath.Equals(fi.DirectoryName, StringComparison.OrdinalIgnoreCase));
                        if (mstr != null && dupe != null)
                        {
                            if (!File.Exists(mstr.FullPath))
                            {
                                smartUpdateNote(dupe, $"<Dupe not deleted: Master is missing on FS: {mstr.FullPath}>\r\n");
                            }
                            else
                            {
                                Trace.WriteLine($"{++i,4}/{fis.Length,-4}   {fi.Length / 1e6,8:N2}\r\n-{fi.DirectoryName,d}{fi.Name,-40}{fi.Length / 1e6,8:N2}\r\n+{mstr.FilePath,d}{mstr.FileName,-40}{mstr.FileSize / 1e6,8:N2}");
#if DEBUG
                                synth.Speak($"Deletion suspended for Debug mode.");
#else
                                File.Delete(dupe.FullPath);
                                smartUpdateNote(dupe, $"<Deleted as Dupe by Name {(useSize ? "and Size" : "only")}. Master: {mstr.FullPath}>\r\n");
#endif
                            }
                        }
                    } // foreach

                    SaveRpt += Environment.NewLine + db.GetDbChangesReport(5);
#if !DEBUG
                    SaveRpt += Environment.NewLine + db.TrySaveReport(" F12 rows saved ");
#endif
                }
            }
            catch (Exception ex) { ex.Log(); ErrorMsg = ex.Message; throw; }

            await Task.Delay(9);
        }
        async Task <long> doFile_OLD(string folder, bool isMasterish, A0DbContext db, Stopwatch sw, SHA256 ha, long idx, FileInfo fi)
        {
            {
                var pl = await smartHashFile_FastByFileInfo_OLD(folder, db, sw, ha, TtlLen, PrgLen, fi, isMasterish);

                lock (_thisLock)
                {
                    PrgLen = pl;
                    Interlocked.Increment(ref idx);
                    if ((idx) % _dbPackLen == 0)
                    {
                        SaveRpt += Environment.NewLine + db.TrySaveReport($"saved; ttl {idx}");
                    }
                }
            }

            return(idx);
        }
Exemple #8
0
        void updateNewAuditHistRow(DateTime auditTimeID, string mode)
        {
            using (var db = new A0DbContext())
            {
                var ah = db.AuditHists.FirstOrDefault(r => r.AuditTimeID == auditTimeID) ?? db.AuditHists.Local.FirstOrDefault(r => r.AuditTimeID == auditTimeID);
                if (ah == null)
                {
                    return;
                }

                ah.TotalAdded   = _TotalAdded;
                ah.TotalHashed  = _TotalHashed;
                ah.FoundRenamed = _TotalRenamed;

                InfoMsg += $"\r\n FINAL:  Found {_ah.TotalFound:N0},  Added {_TotalAdded:N0},  Hashed {_TotalHashed:N0},  Moved {_TotalRenamed:N0},  Updated {_TotalUpdated:N0},  Deleted {_TotalDeleted:N0} ({_TtlBytesDeleted / (1024 * 1024):N0} mb)";

                ah.Note = $"{mode}: {InfoMsg.Substring(8)} \r\n";

                SaveRpt += Environment.NewLine + db.TrySaveReport("r/s saved");
            }
        }
        protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
        {
            if (_db.HasUnsavedChanges())
            {
                switch (MessageBox.Show($"Would you like to save the changes? \r\n\n{_db.GetDbChangesReport()}", "Unsaved changes detected", MessageBoxButton.YesNoCancel, MessageBoxImage.Question))
                {
                default:
                case MessageBoxResult.Cancel: e.Cancel = true; return;

                case MessageBoxResult.Yes: var(success, rowsSavedCnt, report) = _db.TrySaveReport(); if (!success)
                    {
                        MessageBox.Show(report, $"Attach to process!!!  ({rowsSavedCnt})");
                    }
                    break;

                case MessageBoxResult.No: break;
                }
            }

            //if (_dispose)
            _db.Dispose();

            base.OnClosing(e);
        }
Exemple #10
0
        static DnLd getDnldRow(A0DbContext db, string audioFile)
        {
            try
            {
                if (!db.DnLds.Any())
                {
                    db.DnLds.Load();
                }

                var nmeOnly = Path.GetFileNameWithoutExtension(audioFile);
                var cnt     = db.DnLds.Count(r => r.CastFilenameExt.Contains(nmeOnly));
                if (cnt == 1)
                {
                    return(db.DnLds.First(r => r.CastFilenameExt.Contains(nmeOnly)));
                }
                if (cnt > 1)
                {
                    var nameExt = Path.GetFileName(audioFile);

                    cnt = db.DnLds.Count(r => r.CastFilenameExt.Contains(nameExt));
                    if (cnt == 1)
                    {
                        return(db.DnLds.First(r => r.CastFilenameExt.Contains(nameExt)));
                    }
                    if (cnt > 1)
                    {
                        cnt = db.DnLds.Count(r => r.CastTitle == nmeOnly);
                        if (cnt >= 1)
                        {
                            return(db.DnLds.First(r => r.CastTitle == nmeOnly));
                        }
                        //else // if (cnt > 1)
                        //{
                        //	MessageBox.Show($"{cnt} matches in BD for \n\n '{nmeOnly}' \n\n\n\t\t\t\t\tWhy???", "You wanna see this!!!", MessageBoxButton.OK, MessageBoxImage.Question);
                        //}
                    }
                }
                else // == 0
                {
                    if (File.Exists(audioFile))
                    {
                        var dr = new DnLd ///////////////// Not a podcast: found in the folder => add to DB for further reference.
                        {
                            CastSummary       = "Not a podcast: found in the folder.",
                            CastFileLength    = new FileInfo(audioFile).Length,
                            CastFilenameExt   = Path.GetFileName(audioFile),
                            CastTitle         = Path.GetFileNameWithoutExtension(audioFile),
                            CastUrl           = audioFile,
                            DnldStatusId      = "C",
                            ReDownload        = false,
                            FeedId            = 180,
                            Feed              = null,
                            IsDownloading     = false,
                            PublishedAt       = DateTime.Today,
                            ModifiedAt        = DateTime.Now,
                            RowAddedAt        = DateTime.Now,
                            RowAddedByPC      = Environment.MachineName,
                            ErrLog            = "",
                            DurationMin       = ConstHelper.Unknown4004Duration, //? will be refined later?
                            TrgFileSortPrefix = ""
                        };

                        db.DnLds.Add(dr);

                        db.TrySaveReport();
                        return(dr);
                    }
                }
            }
            catch (Exception ex)
            {
                ex.Log();
            }
            return(null);
        }
        async Task DeleteAllDupesAutoAndManual_F10()
        {
            await Task.Delay(9);

            InfoMsg = "F10: ...";
            synth.SpeakAsync("F10: Major Deleting all dupes from the main/base folder.");

            //throw new Exception("SUSPENDED: How to tell dupe from not? ");

            _TtlBytesDeleted = _TotalAdded = _TotalRenamed = _TotalDeleted = _TotalUpdated = _TotalHashed = 0;
            try
            {
                using (var db = new A0DbContext())
                {
                    getAddAuditId("Delete all dupes", db);

                    var dupesByHash = db.FileDetails.Where(r => string.IsNullOrEmpty(r.Note) || (!r.Note.Contains(_nfo) && !r.Note.Contains(_ndm))).GroupBy(g => g.FileHash).ToList().Select(r => new { r.Key, Cnt = r.Count(), Sze = r.Max(y => y.FileSize) }).Where(r => r.Cnt > 1).OrderByDescending(r => r.Sze).ToList();
                    var dupesBySize = db.FileDetails.Where(r => string.IsNullOrEmpty(r.Note) || (!r.Note.Contains(_nfo) && !r.Note.Contains(_ndm))).GroupBy(g => g.FileSize).ToList().Select(r => new { r.Key, Cnt = r.Count(), Sze = r.Max(y => y.FileSize) }).Where(r => r.Cnt > 1).OrderByDescending(r => r.Sze).ToList();
                    Trace.Write(/**/ db.FileDetails.Where(r => string.IsNullOrEmpty(r.Note) || (!r.Note.Contains(_nfo) && !r.Note.Contains(_ndm))).GroupBy(g => g.FileSize)./**/ Select(r => new { r.Key, Cnt = r.Count(), Sze = r.Max(y => y.FileSize) }).Where(r => r.Cnt > 1).ToString(), "SQL");

                    await Task.Delay(9);

                    InfoMsg = $"F10: dupesBySize:{dupesBySize.Count:N0}, dupesByHash:{dupesByHash.Count:N0}.";
                    Trace.WriteLine($"        F10: dupesBySize:{dupesBySize.Count:N0}, dupesByHash:{dupesByHash.Count:N0}.");

                    TtlLen = (long)(_ah.TotalFound = dupesBySize.Count());
                    PrgLen = 0;                //here not file size but idx.
                    var abort = false;
                    dupesBySize.ForEach(dbs => //foreach (var r in dupesBySize)
                    {
                        PrgLen++;
                        Trace.WriteLine($"{PrgLen,3} / {dupesBySize.Count})  {dbs.Cnt} matches by size of {dbs.Key:N0}.");
                        if (!abort)
                        {
                            lock (_thisLock) { if ((PrgLen) % 10 == 0)
                                               {
                                                   SaveRpt += Environment.NewLine + db.TrySaveReport($"saved; ttl {PrgLen}");
                                               }
                            }
                        }

                        db.FileDetails.Where(f => f.FileSize == dbs.Key).OrderBy(f => f.FileName.Length).ToList().ForEach(f => Trace.WriteLine($"  {f.FileSize / 1048576,8:N1}mb     {f.FilePath}\\{f.FileName}")); // db.FileDetails.Where(f => string.Compare(f.FileHash, r.Key, true) == 0).OrderBy(f => f.FileName.Length).ToList().ForEach(f => Trace.WriteLine("  {0,8:N1}k     {1}", f.FileSize / 1024, f.FilePath));

                        var ary = db.FileDetails.Where(r => r.FileSize == dbs.Key && (string.IsNullOrEmpty(r.Note) || (!r.Note.Contains(_nfo) && !r.Note.Contains(_ndm)))).OrderBy(f => f.FileName.Length).ToArray();
                        for (var i = 1; i < ary.Length; i++)
                        {
                            if (!abort)
                            {
                                if (!tryRemoveDupe(ary[0], ary[i])) // SUSPENDED: How to tell dupe from not?
                                {
                                    abort = true;
                                    synth.SpeakAsync("Wait: aborting the F10 processing...");
                                }
                            }
                        }
                    });

                    SaveRpt += Environment.NewLine + db.GetDbChangesReport(5);

#if !DEBUG
                    SaveRpt += Environment.NewLine + db.TrySaveReport("r/s saved");
#endif
                }
            }
            catch (Exception ex) { ex.Log(); ErrorMsg = ex.Message; throw; }
            finally
            {
                updateNewAuditHistRow(_ah.AuditTimeID, "F10: UnDuping-AutoAll " + SaveRpt);
                synth.Speak("F10 Done.");
            }
        }
Exemple #12
0
 void onSaveChanges(object x)
 {
     Bpr.BeepOk();
     InfoApnd = $"{db.TrySaveReport().rowsSavedCnt} rows saved";
     Bpr.BeepOk();
 }