private void m_PathWatcher_Created(object sender, FileSystemEventArgs e) { LastException = null; AutoResetEvent hFinishedSearchEvent = null; Thread th = null; if ((DBManagerApp.MainWnd as DispatcherObject).CheckAccess()) { CWaitingWnd.ShowAsync(out hFinishedSearchEvent, out th, DBManagerApp.MainWnd.Title, string.Format(Properties.Resources.resfmtScanningFile, e.FullPath), DBManagerApp.MainWnd); } lock (EventsCS) { if (State != enScanningThreadState.Worked) { return; } m_PathWatcher.EnableRaisingEvents = false; CFileScanner Scanner; if (m_FileScanners.TryGetValue(e.FullPath, out Scanner)) { Scanner.Start(e.FullPath); } else { Scanner = new CFileScanner(e.FullPath, this, false); if (Scanner.State == enScanningThreadState.Worked) { m_FileScanners.Add(e.FullPath, Scanner); } } DBManagerApp.m_Entities.SaveChanges(); m_PathWatcher.EnableRaisingEvents = true; } if (hFinishedSearchEvent != null) { hFinishedSearchEvent.Set(); } }
/// <summary> /// Запустить сканирование /// </summary> /// <param name="ScanningDir"></param> /// <param name="MadeChanges"></param> /// <returns></returns> public override bool Start(string ScanningDir) { LastException = null; if (State == enScanningThreadState.Worked) { // Поток в данный момент работает return(false); } if (!Directory.Exists(ScanningDir)) { return(false); } ScanningPath = ScanningDir; // Пытаемся запустить все все сканеры файлов List <string> ScannersPaths = m_FileScanners.Keys.ToList(); for (int i = 0; i < ScannersPaths.Count;) { CFileScanner scanner = m_FileScanners[ScannersPaths[i]]; scanner.ScanningPath = ScannersPaths[i]; if (scanner.Start(scanner.ScanningPath)) { i++; } else { // Запустить сканер почему-то не получилось lock (DBManagerApp.m_AppSettings.m_SettingsSyncObj) DBManagerApp.m_AppSettings.m_Settings.dictFileScannerSettings.Remove(scanner.ScanningPath); m_FileScanners.Remove(ScannersPaths[i]); ScannersPaths.RemoveAt(i); } } m_PathWatcher.BeginInit(); m_PathWatcher.Path = ScanningDir; m_PathWatcher.EnableRaisingEvents = true; // Эту операцию нужно делать после запуска всех сканеров файлов m_PathWatcher.EndInit(); State = enScanningThreadState.Worked; return(true); }
/// <summary> /// /// </summary> /// <param name="Param"></param> /// <param name="MadeChanges"></param> public override bool SyncWithFilesAndDB(CScannerBase.CSyncParamBase Param) { LastException = null; CSyncParam SyncParam = Param as CSyncParam; if (SyncParam == null || SyncParam.m_Dir == GlobalDefines.DEFAULT_XML_STRING_VAL || !Directory.Exists(SyncParam.m_Dir)) { return(false); } using (var wrapper = new DisposableWrapper <ShowAsyncResult>(CWaitingWnd.ShowAsync(DBManagerApp.MainWnd.Title, string.Format(Properties.Resources.resfmtSyncingDir, SyncParam.m_Dir), DBManagerApp.MainWnd, true), asyncResult => { if (asyncResult?.hFinishedSearchEvent != null) { asyncResult.hFinishedSearchEvent.Set(); } })) { lock (EventsCS) { if (State == enScanningThreadState.Worked) { // Синхронизацию можно проводить только при незапущенном сканировании return(false); } m_PathWatcher.EnableRaisingEvents = false; List <string> ScannedFilesFullPaths = new List <string>(); try { if (SyncParam.m_lstFileScannerSettings != null) { bool AllFilesSync = true; foreach (CFileScannerSettings ScannerSettings in SyncParam.m_lstFileScannerSettings) { if (Path.GetDirectoryName(ScannerSettings.FullFilePath) != SyncParam.m_Dir) { // Файл не находится в просматриваемой папке => он нам не нужен AllFilesSync = false; lock (DBManagerApp.m_AppSettings.m_SettingsSyncObj) DBManagerApp.m_AppSettings.m_Settings.dictFileScannerSettings.Remove(ScannerSettings.FullFilePath); continue; } string FullScannerFilePath = Path.Combine(SyncParam.m_Dir, ScannerSettings.FullFilePath); ScannedFilesFullPaths.Add(FullScannerFilePath); CFileScanner Scanner = null; if (m_FileScanners.TryGetValue(FullScannerFilePath, out Scanner)) { m_FileScanners[FullScannerFilePath] = Scanner = new CFileScanner(ScannerSettings.FullFilePath, this, true, new CFileScanner.CSyncParam(ScannerSettings.GroupId, FullScannerFilePath)); if (!Scanner.SyncSuccessfully) { // Синхронизироваться не удалось m_FileScanners.Remove(FullScannerFilePath); AllFilesSync = false; lock (DBManagerApp.m_AppSettings.m_SettingsSyncObj) DBManagerApp.m_AppSettings.m_Settings.dictFileScannerSettings.Remove(ScannerSettings.FullFilePath); } } else { Scanner = new CFileScanner(ScannerSettings.FullFilePath, this, true, new CFileScanner.CSyncParam(ScannerSettings.GroupId, FullScannerFilePath)); if (Scanner.SyncSuccessfully) { m_FileScanners.Add(ScannerSettings.FullFilePath, Scanner); } else { // Синхронизироваться не удалось AllFilesSync = false; lock (DBManagerApp.m_AppSettings.m_SettingsSyncObj) DBManagerApp.m_AppSettings.m_Settings.dictFileScannerSettings.Remove(ScannerSettings.FullFilePath); } } } if (!AllFilesSync) { DBManagerApp.m_AppSettings.Write(); } } // Пытаемся загрузить данные из всех остальных XML-файлов, имеющихся в папке string[] AllXMLFullFilePaths = Directory.GetFiles(SyncParam.m_Dir, "*.xml"); foreach (string FullFilePath in from xmlFileL in AllXMLFullFilePaths join xmlFileR in ScannedFilesFullPaths on xmlFileL equals xmlFileR into XMLFiles from scannedFile in XMLFiles.DefaultIfEmpty() where scannedFile == null select xmlFileL) { CFileScanner Scanner = null; if (m_FileScanners.TryGetValue(FullFilePath, out Scanner)) { m_FileScanners[FullFilePath] = Scanner = new CFileScanner(FullFilePath, this, true, new CFileScanner.CSyncParam(m_FileScanners[FullFilePath].Group == null ? GlobalDefines.NO_OUR_COMP_IN_DB : m_FileScanners[FullFilePath].Group.id_group, FullFilePath)); if (!Scanner.SyncSuccessfully) { // Синхронизироваться не удалось m_FileScanners.Remove(FullFilePath); lock (DBManagerApp.m_AppSettings.m_SettingsSyncObj) DBManagerApp.m_AppSettings.m_Settings.dictFileScannerSettings.Remove(FullFilePath); continue; } } else { Scanner = new CFileScanner(FullFilePath, this, true, new CFileScanner.CSyncParam(GlobalDefines.NO_OUR_COMP_IN_DB, FullFilePath)); if (Scanner.SyncSuccessfully) { // Удалось синхронизироваться => добавляем сканер в m_FileScanners и в файл настроек m_FileScanners.Add(FullFilePath, Scanner); } } if (Scanner.Group != null) { CFileScannerSettings ScannerSettings = new CFileScannerSettings() { FullFilePath = FullFilePath, GroupId = Scanner.Group.id_group }; lock (DBManagerApp.m_AppSettings.m_SettingsSyncObj) DBManagerApp.m_AppSettings.m_Settings.dictFileScannerSettings.TryAddValue(FullFilePath, ScannerSettings); } } } catch (Exception ex) { List <CDataChangedInfo> Changes = new List <CDataChangedInfo>(); OnException(ref Changes, ex, CompId); } if (Directory.Exists(m_PathWatcher.Path)) { m_PathWatcher.EnableRaisingEvents = true; } } } return(true); }