コード例 #1
0
        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();
            }
        }
コード例 #2
0
        /// <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);
        }
コード例 #3
0
        /// <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);
        }