/// <summary>获取某通道视频在某时段对应的有效的文件夹列表</summary> public static DateTime[] GetFolderPaths(string videoId, int streamId, DateTime start, DateTime end) { List <DateTime> list = new List <DateTime>(); string path = GlobalData.VideoPath(videoId, streamId); if (Directory.Exists(path)) { DateTime cur = start.Date; while (cur < end) { DirectoryInfo dir = new DirectoryInfo(Path.Combine(path, GlobalProcess.FolderPath(cur))); if (dir.Exists) { list.Add(cur); cur = cur.AddDays(1); } else if (dir.Parent.Exists) { cur = cur.AddDays(1); } else if (dir.Parent.Parent.Exists) { cur = new DateTime(cur.Year, cur.Month, 1).AddMonths(1); } else { cur = new DateTime(cur.Year + 1, 1, 1); } } } return(list.ToArray()); }
public static void Add1() { var beginTime = new DateTime(2016, 3, 22, 23, 50, 1, 156); string videoId = "videoId"; int streamId = 2; string path = System.IO.Path.Combine(GlobalData.Path, $"{videoId}_{streamId}"); GlobalData.FileLengthSup = new TimeSpan(0, 5, 0); using (SyncRecorder recorder = new SyncRecorder(path)) { recordAddMinutes(recorder, beginTime, 0, DataType.StreamDataKey); recordAddMinutes(recorder, beginTime, 1, DataType.SysHead); //new recordAddMinutes(recorder, beginTime, 1, DataType.StreamDataKey); recordAddMinutes(recorder, beginTime, 2, DataType.StreamDataKey); recordAddMinutes(recorder, beginTime, 3, DataType.StreamData); recordAddMinutes(recorder, beginTime, 4, DataType.StreamDataKey); recordAddMinutes(recorder, beginTime, 5, DataType.StreamData); recordAddMinutes(recorder, beginTime, 6, DataType.StreamData); recordAddMinutes(recorder, beginTime, 7, DataType.StreamDataKey); //new recordAddMinutes(recorder, beginTime, 8, DataType.StreamData); recordAddMinutes(recorder, beginTime, 9, DataType.SysHead); //new recordAddMinutes(recorder, beginTime, 9, DataType.StreamDataKey); recordAddMinutes(recorder, beginTime, 10, DataType.StreamData); recordAddMinutes(recorder, beginTime, 11, DataType.StreamData); recordAddMinutes(recorder, beginTime, 12, DataType.StreamDataKey); //new recordAddMinutes(recorder, beginTime, 13, DataType.StreamData); recordAddMinutes(recorder, beginTime, 14, DataType.StreamData); recordAddMinutes(recorder, beginTime, 15, DataType.StreamDataKey); recordAddMinutes(recorder, beginTime, 16, DataType.StreamData); recordAddMinutes(recorder, beginTime, 17, DataType.StreamData); recordAddMinutes(recorder, beginTime, 18, DataType.StopSign); writeError(Path.Combine(path, GlobalProcess.FolderPath(beginTime)), $"20100322235959999{GlobalProcess.IndexesFormat()}"); } }
public VideoTimePeriodsPacket Search(DateTime beginTime, DateTime endTime, IVideoInfo videoInfo) { string path = GlobalData.VideoPath(videoInfo.VideoId, videoInfo.StreamId); DateTime[] dates = VideoStoragerManager.GetFolderPaths(videoInfo.VideoId, videoInfo.StreamId, beginTime, endTime); List <TimePeriodPacket> tis = new List <TimePeriodPacket>(); Parallel.ForEach(dates, date => { string folder = Path.Combine(path, GlobalProcess.FolderPath(date)); var array = FolderManager.GetTimePeriods(folder); if (array.Length > 0) { lock (tis) tis.AddRange(array); } }); if (endTime > DateTime.Now.Date) { tis.AddRange(findTodayLastest(path, endTime)); } var timeCombines = TimePeriodManager.Combine(tis.ToArray()); var validArray = TimePeriodManager.GetIntersections(timeCombines, new TimePeriodPacket(beginTime, endTime)); return(new VideoTimePeriodsPacket(videoInfo, validArray)); }
private static void addErrorFile(string videoId, int streamId, DateTime date) { string path = Path.Combine(GlobalData.Path, $"{videoId}_{streamId}", GlobalProcess.FolderPath(date)); Directory.CreateDirectory(path); writeError(path, $"{GlobalProcess.FileNameFromDate(date)}235959999{GlobalProcess.IndexesFormat()}"); writeError(path, $"{GlobalProcess.FileNameFromDate(date)}235959999{GlobalProcess.RecFormat()}"); }
public void TestFileManager_GetTimePeriods() { BaseInfo.AddData_videoId_003_2_20160330(); DateTime time = new DateTime(2016, 03, 30); string fileName = Path.Combine(GlobalData.Path, @"videoID_003_2", GlobalProcess.FolderPath(time), $"{GlobalProcess.FileNameFromDate(time)}{GlobalProcess.SimpleIndexesFormat()}"); Assert.IsNotNull(FileManager.GetTimePeriods(fileName)); using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) Assert.IsNotNull(FileManager.GetTimePeriods(fileName)); }
TimePeriodPacket[] findTodayLastest(string path, DateTime end) { string folder = Path.Combine(path, GlobalProcess.FolderPath(DateTime.Now)); var array = FolderManager.GetIndexesFiles(folder); if (array.Length > 0) { string file = array.Max(); var packets = FileManager.GetIndexesPackets(file); return(TimePeriodManager.Combine(packets)); } return(new TimePeriodPacket[0]); }
/// <summary>获取某通道视频在某时段对应文件的首个视频头</summary> public static VideoBasePacket GetVideoBaseInfom(string videoId, int streamId, DateTime beginTime, DateTime endTime) { string path = GlobalData.VideoPath(videoId, streamId); DateTime[] dates = GetFolderPaths(videoId, streamId, beginTime, endTime); foreach (var date in dates) { var header = FolderManager.GetVideoHeader(Path.Combine(path, GlobalProcess.FolderPath(date)), beginTime, endTime); if (header != null && header.Type == DataType.SysHead) { long length = getLength(path, dates, beginTime, endTime, StreamPacket.Encode(header).Length + 4); return(new VideoBasePacket(header.Buffer, header.Time, length)); } } return(null); }
public void TestVideoStoragerManager_SearchEarliestSubfolder_One() { BaseInfo.AddOldVideo(); string videoId = "videoID_003"; int streamId = 2; string path = GlobalData.VideoPath(videoId, streamId); DateTime beginTime = new DateTime(2001, 3, 23, 01, 50, 1, 156); Directory.CreateDirectory(Path.Combine(path, @"10000\01\01")); Directory.CreateDirectory(Path.Combine(path, @"2001\1\01")); string earliestPath = Path.Combine(path, GlobalProcess.FolderPath(beginTime)); var info = VideoStoragerManager.SearchEarliestSubfolder(path); Assert.IsNotNull(info); Assert.AreEqual(earliestPath, info.Path); Assert.AreEqual(beginTime.Date, info.Time); }
static long getLength(string path, DateTime[] dates, DateTime beginTime, DateTime endTime, int headerLength) { long size = 0; for (int i = 0; i < dates.Length; i++) { var date = dates[i]; string folder = Path.Combine(path, GlobalProcess.FolderPath(date)); if (date > beginTime.Date && date < endTime.Date) { size += getAllSize(folder, headerLength); } else { size += getValidSize(folder, beginTime, endTime, headerLength); } } return(size); }
static string getPath(string videoId, int streamId, DateTime time) { return(Path.Combine(GlobalData.VideoPath(videoId, streamId), GlobalProcess.FolderPath(time), GlobalProcess.FileNameFromTime(time) + GlobalProcess.RecFormat())); }
public void Test_GlobalProcess_FolderPath() { Assert.AreEqual(@"2016\03\29", GlobalProcess.FolderPath(new DateTime(2016, 3, 29, 11, 33, 20, 555))); }
private static string getPath(string videoId, int streamId, DateTime time) { return(Path.Combine(GlobalData.VideoPath(videoId, streamId), GlobalProcess.FolderPath(time))); }
protected override void updateFolderPath() { _curFolder = Path.Combine(_filePath, GlobalProcess.FolderPath(_fileStartTime)); }