public static List <FileProcessInfo> GetActiveProcesses()
        {
            using (var db = new FileUploadDbEntities())
            {
                var completedState = (byte)ProcessState.Completed;
                var processes      = db.EFFileProcessInfoes
                                     .Include("DataFileInfo")
                                     .Where(p => p.State != completedState).ToList();

                List <FileProcessInfo> result = new List <FileProcessInfo>();
                foreach (var process in processes)
                {
                    var processInfo = new FileProcessInfo();
                    processInfo.Id        = process.Id;
                    processInfo.Message   = process.Message;
                    processInfo.UniqueId  = process.UniqueId;
                    processInfo.StartTime = process.StartTime;
                    processInfo.State     = (ProcessState)process.State;
                    processInfo.Result    = (ProcessResult)process.Result;

                    processInfo.FileInfo              = new DataFileInfo();
                    processInfo.FileInfo.Name         = process.DataFileInfo.Name;
                    processInfo.FileInfo.Hash         = process.DataFileInfo.Hash;
                    processInfo.FileInfo.Size         = process.DataFileInfo.Size;
                    processInfo.FileInfo.CreationTime = process.DataFileInfo.CreationTime;

                    result.Add(processInfo);
                }

                return(result);
            }
        }
示例#2
0
        private bool SaveFileToSend(FileSystemInfo file)
        {
            FileProcessInfo fileProcessInfo = null;

            // the file is being processed or has been processed
            if (_queue.ContainsKey(FilePrefix + file.Name))
            {
                fileProcessInfo = _queue[FilePrefix + file.Name];
            }

            // the file is new
            if (fileProcessInfo == null)
            {
                fileProcessInfo = new FileProcessInfo {
                    Status        = FileProcessStatus.InProcess,
                    NumberOfTries = 0
                };
                _queue.TryAdd(FilePrefix + file.Name, fileProcessInfo);
            }
            else if (fileProcessInfo.Status == FileProcessStatus.InProcess)
            {
                AnalyticsLog.Log(TAG, "The file '" + file.Name + "' is being processed");
                return(false);
            }
            else if (fileProcessInfo.NextProcessDate != null && fileProcessInfo.NextProcessDate > DateTime.Now)
            {
                AnalyticsLog.Log(TAG, "Too early to reprocess the file '" + file.Name + "'");
                return(false);
            }

            return(true);
        }
        public void Refresh(FileProcessInfo info)
        {
            Info = info;

            OnPropertChanged(nameof(Id));
            OnPropertChanged(nameof(this.ElapsedTime));
            OnPropertChanged(nameof(this.State));
            OnPropertChanged(nameof(this.FileName));
            OnPropertChanged(nameof(this.FileHash));
            OnPropertChanged(nameof(this.FileSize));
            OnPropertChanged(nameof(this.StartTime));
            OnPropertChanged(nameof(this.Result));
            OnPropertChanged(nameof(this.Message));
            OnPropertChanged(nameof(this.ReportButtonText));
        }
        public static bool FileExists(DataFileInfo fileInfo, out FileProcessInfo inProcess)
        {
            if (fileInfo == null)
            {
                throw new ArgumentNullException(nameof(fileInfo));
            }

            bool result = false;

            inProcess = null;

            using (var db = new FileUploadDbEntities())
            {
                var existingFile = db.EFDataFileInfoes
                                   .FirstOrDefault(f => f.Hash == fileInfo.Hash);

                if (existingFile != null)
                {
                    result = true;
                    if (!existingFile.FileProcessInfoes.IsLoaded)
                    {
                        existingFile.FileProcessInfoes.Load();
                    }

                    var processInfo = existingFile.FileProcessInfoes.FirstOrDefault();

                    if (processInfo != null)
                    {
                        inProcess          = new FileProcessInfo();
                        inProcess.Id       = processInfo.Id;
                        inProcess.FileInfo = new DataFileInfo()
                        {
                            CreationTime = existingFile.CreationTime,
                            Hash         = existingFile.Hash,
                            Name         = existingFile.Name,
                            Size         = existingFile.Size,
                        };
                        inProcess.Result    = (ProcessResult)processInfo.Result;
                        inProcess.StartTime = processInfo.StartTime;
                        inProcess.State     = (ProcessState)processInfo.State;
                    }
                }
            }

            return(result);
        }
示例#5
0
        public StartFileProcessViewModel(ISynchronizeInvoke context, FileInfo fileInfo) : base(context, null)
        {
            FileInfo = fileInfo ?? throw new ArgumentNullException(nameof(fileInfo));

            var dataFileInfo = new DataFileInfo();

            dataFileInfo.Name         = fileInfo.Name;
            dataFileInfo.Size         = fileInfo.Length;
            dataFileInfo.CreationTime = fileInfo.CreationTime;

            var processInfo = new FileProcessInfo();

            processInfo.UniqueId  = Guid.NewGuid();
            processInfo.FileInfo  = dataFileInfo;
            processInfo.StartTime = DateTime.Now;
            processInfo.State     = ProcessState.None;
            processInfo.Result    = ProcessResult.None;

            Info = processInfo;
        }
示例#6
0
        private void SendAndDeleteFiles(List <string> events, FileSystemInfo file)
        {
            if (events.Count == 0)
            {
                return;
            }

            AnalyticsLog.Log(TAG, "Send and delete file '" + file.Name + "' File");

            AnalyticsApi.SendEvents(events, succeeded => {
                if (succeeded)
                {
                    lock (FileAccess) {
                        AnalyticsLog.Log(TAG, "Delete file: '" + file.Name + "' File");

                        if (_queue.ContainsKey(FilePrefix + file.Name))
                        {
                            FileProcessInfo info;
                            _queue.TryRemove(FilePrefix + file.Name, out info);
                        }

                        file.Delete();
                    }
                }
                else if (_queue.ContainsKey(FilePrefix + file.Name))
                {
                    FileProcessInfo fileProcessInfo = _queue[FilePrefix + file.Name];
                    fileProcessInfo.Status          = FileProcessStatus.Waiting;
                    fileProcessInfo.NumberOfTries++;
                    int delay = _backOffDelays.Last();
                    if (fileProcessInfo.NumberOfTries < _backOffDelays.Length)
                    {
                        delay = _backOffDelays[fileProcessInfo.NumberOfTries];
                    }

                    AnalyticsLog.Log(TAG, "Retry pushing '" + file.Name + "' file in " + delay + " seconds");

                    fileProcessInfo.NextProcessDate = DateTime.Now.AddSeconds(delay);
                }
            });
        }
        public static FileProcessInfo StartProcess(FileProcessInfo startInfo, Stream dataStream)
        {
            if (startInfo == null)
            {
                throw new ArgumentNullException(nameof(startInfo));
            }
            if (dataStream == null)
            {
                throw new ArgumentNullException(nameof(dataStream));
            }

            //todo dir name
            var dirName = Environment.ExpandEnvironmentVariables("%temp%\\FileUploadManager");

            if (!Directory.Exists(dirName))
            {
                Directory.CreateDirectory(dirName);
            }
            var tempFileName = Path.Combine(dirName, startInfo.UniqueId.ToString());

            try
            {
                using (var fs = new FileStream(tempFileName, FileMode.Create, FileAccess.Write))
                {
                    var buffer = new byte[64 * 1024];
                    int readCount;
                    while ((readCount = dataStream.Read(buffer, 0, buffer.Length)) > 0)
                    {
                        fs.Write(buffer, 0, readCount);
                    }
                }

                using (var db = new FileUploadDbEntities())
                {
                    db.Connection.Open();
                    using (var tran = db.Connection.BeginTransaction())
                    {
                        var fileInfo = new EFDataFileInfo();
                        fileInfo.CreationTime = startInfo.FileInfo.CreationTime;
                        fileInfo.Hash         = startInfo.FileInfo.Hash;
                        fileInfo.HostName     = Environment.MachineName;
                        fileInfo.Name         = startInfo.FileInfo.Name;
                        fileInfo.Path         = tempFileName;
                        fileInfo.Size         = startInfo.FileInfo.Size;
                        //todo: GETDATE()
                        fileInfo.InsertTime = DateTime.Now;

                        EFFileProcessInfo processInfo = new EFFileProcessInfo();
                        processInfo.DataFileInfo = fileInfo;
                        processInfo.StartTime    = startInfo.StartTime;
                        processInfo.UniqueId     = startInfo.UniqueId;
                        processInfo.State        = (byte)ProcessState.Parsing;

                        db.AddToEFFileProcessInfoes(processInfo);

                        db.SaveChanges();
                        tran.Commit();

                        startInfo.Id    = processInfo.Id;
                        startInfo.State = (ProcessState)processInfo.State;

                        return(startInfo);
                    }
                }
            }
            catch (Exception e)
            {
                try
                {
                    if (File.Exists(tempFileName))
                    {
                        File.Delete(tempFileName);
                    }
                }
                catch (Exception innerException)
                {
                    //todo use FT.Common
                    e.Data["InnerException"] = innerException.ToString();
                }

                throw;
            }
        }
 public FileProcessViewModel(ISynchronizeInvoke context, FileProcessInfo info) : base(context)
 {
     Info = info;
 }
 public ActiveFileProcessViewModel(ISynchronizeInvoke context, FileProcessInfo info) : base(context, info)
 {
 }