public void TestMethodMoveArchive()
        {
            string srcFullFileName  = Path.Combine(SourceFolderTest, SourceFileName);
            string arcFullFileName  = FileCompressor.GetArchiveFileName(srcFullFileName);
            string arcFileName      = Path.GetFileName(arcFullFileName);
            string destFullFileName = Path.Combine(TargetFolderTest, arcFileName);

            string[] sourceFiles;
            string[] sourceZipFiles;
            string[] targetFiles;
            sourceFiles    = Directory.GetFiles(SourceFolderTest, SourceFileName);
            sourceZipFiles = Directory.GetFiles(SourceFolderTest, arcFileName);
            targetFiles    = Directory.GetFiles(TargetFolderTest, arcFileName);
            Assert.AreEqual(1, sourceFiles.Length, "Source file must be present");
            Assert.AreEqual(0, sourceZipFiles.Length, "Source compressed file must be absent");
            Assert.AreEqual(0, targetFiles.Length, "Target compreesd file must be absent");

            FileCompressor.Compress(srcFullFileName);
            sourceZipFiles = Directory.GetFiles(SourceFolderTest, arcFileName);
            Assert.AreEqual(1, sourceZipFiles.Length, "Source compressed file must be present");

            FileMover.Move(arcFullFileName, destFullFileName);
            sourceZipFiles = Directory.GetFiles(SourceFolderTest, arcFileName);
            targetFiles    = Directory.GetFiles(TargetFolderTest, arcFileName);

            Assert.AreEqual(0, sourceZipFiles.Length, "Source compressed file must be absent");
            Assert.AreEqual(1, targetFiles.Length, "Target compreesd file must be present");
        }
Example #2
0
        public void RunHandlingOfWorkingItems(
            Action <FileItem> addItemToListAction,
            Action storeItems,
            Action <Exception, FileItem> errorAction,
            bool exitAfterFinishAllItems = true)
        {
            bool isRunning;

            lock (_lockObj)
            {
                isRunning = IsRunning;
            }

            if (isRunning)
            {
                return;
            }

            lock (_lockObj)
            {
                IsRunning = true;
                OnStateChanged(IsRunning);
                _log.Debug($"MainWorker will be started for {_filesQueue.Count} files. Cansellation pending {CancellationPending}");
            }

            Task.Run(
                () =>
            {
                _log.Debug($" MainWorker started");
                Thread.CurrentThread.Name = "Main worker";
                while (!CancellationPending)
                {
                    if (_filesQueue.TryDequeue(out FileSystemEventArgs moveItem))
                    {
                        _log.Debug($" Do work for {moveItem.Name}");
                        FileItem fileItem = new FileItem {
                            Name = moveItem.Name, CopyDate = DateTime.Now
                        };
                        //_log.Debug($"New item detected {e.FullPath}. Zip and move it");
                        DateTime creationTime = GetFileCreationTime(moveItem.FullPath);
                        //item.TimeStamp = creationTime.ToShortDateString() + " " + creationTime.ToShortTimeString();
                        fileItem.TimeStamp = creationTime;

                        try
                        {
                            addItemToListAction?.Invoke(fileItem);

                            string sourceFilePath = moveItem.FullPath;
                            string archiveName    = FileCompressor.GetArchiveFileName(sourceFilePath);
                            string fileName       = Path.GetFileName(archiveName);
                            string destFilePath   = Path.Combine(TargetFolder, fileName);

                            CompressFile(sourceFilePath);

                            MoveFile(archiveName, destFilePath);
                            fileItem.TargetFilePath = destFilePath;

                            DeleteFile(sourceFilePath);

                            storeItems?.Invoke();

                            //_dataSerializer.Store(_items);
                        }
                        catch (Exception ex)
                        {
                            _log.Error(ex);

                            if (errorAction != null)
                            {
                                errorAction(ex, fileItem);
                            }

                            //Not good as exception could come in theory but we need to store error state
                            storeItems?.Invoke();
                        }
                    }
                    else
                    {
                        if (exitAfterFinishAllItems && _filesQueue.Count == 0)
                        {
                            _log.Debug($" MainWorker - break by zero items");
                            break;
                        }
                    }

                    Thread.Sleep(50);
                }

                lock (_lockObj)
                {
                    IsRunning = false;
                    OnStateChanged(IsRunning);
                }

                _log.Debug($"MainWorker stopped. CancellationPending={CancellationPending}");
            });
        }