Esempio n. 1
0
        async Task WriteTasksAsync(IEnumerable <WriteTask> writeTasks, DirSnap dirSnap)
        {
            if (_currentWriter == null)
            {
                string filePath;
                if (dirSnap.IsEmpty)
                {
                    filePath = dirSnap.GetFilePath(0);
                    dirSnap.RegisterFile(filePath);
                }
                else
                {
                    filePath = dirSnap.LastFile().FilePath;
                }
                var fileInfo = new FileInfo(filePath);

                _currentWriter      = GetWriter(filePath);
                _approxBytesWritten = fileInfo.Exists ? fileInfo.Length : 0;
            }

            var flushNeeded = false;

            foreach (var task in writeTasks)
            {
                foreach (var data in task.Data)
                {
                    var line = Convert.ToBase64String(data);
                    _currentWriter.Write(line);
                    _currentWriter.WriteLine(LineTerminator);
                    _approxBytesWritten += line.Length + 1;
                    flushNeeded          = true;

                    if (_approxBytesWritten > _settings.ApproximateMaximumFileLength)
                    {
                        await _currentWriter.FlushAsync();

                        flushNeeded = false;
                        _currentWriter.Dispose();

                        var nextFileNumber = dirSnap.LastFile().FileNumber + 1;
                        var nextFilePath   = dirSnap.GetFilePath(nextFileNumber);
                        dirSnap.RegisterFile(nextFilePath);

                        _approxBytesWritten = 0;
                        _currentWriter      = GetWriter(nextFilePath);

                        var allFiles = dirSnap.GetFiles().ToList();

                        var filesToDelete = allFiles
                                            .Take(allFiles.Count - _settings.NumberOfFilesToKeep)
                                            .ToList();

                        foreach (var file in filesToDelete)
                        {
                            try
                            {
                                File.Delete(file.FilePath);
                                dirSnap.RemoveFile(file);
                                _logger.Verbose($"Deleted file {file.FilePath}");
                            }
                            catch (Exception exception)
                            {
                                _logger.Information($"Could not delete file {file.FilePath}: {exception.Message}");
                                break;
                            }
                        }
                    }
                }
            }

            if (flushNeeded)
            {
                await _currentWriter.FlushAsync();
            }
        }