//通过起始位置找到内部文件; public static IFile GetInnerFileByPosition(this IIterableFile iterable, long pos) { if (iterable == null || iterable.Children == null) { return(null); } foreach (var item in iterable.Children) { if (item is RegularFile) { if ((item as RegularFile).StartLBA == pos) { return(item); } } else if (item is IIterableFile) { var itera = (item as IIterableFile); if (!(itera.IsBackFile() || itera.IsBackUpFile())) { IFile innerFile = null; if ((innerFile = GetInnerFileByPosition(itera, pos)) != null) { return(innerFile); } } } } return(null); }
//得到内部文件的总大小; public static long GetTotalSize(this IIterableFile file) { if (file.Children != null) { long sum = 0; TraverseAddNum(file, ref sum); return(sum); } return(0); }
/// <summary> /// 判定是否为上级文件(..); /// </summary> /// <param name="dir"></param> /// <returns></returns> public static bool IsBackFile(this IIterableFile dir) { if (dir == null) { return(false); } return(dir.Name == ".."); //return dir.Children != null && // dir.Children.Count != 0 && // dir.Children.Contains(dir.Parent); }
/// <summary> /// /// </summary> /// <param name="itrFile"></param> /// <returns></returns> public static int IndexOf(this IIterableFile itrFile, IFile file) { if (itrFile == null && itrFile.Children == null) { return(-1); } var idx = 0; foreach (var item in itrFile.Children) { if (item == file) { return(idx); } idx++; } return(-1); }
private static void TraverseAddNum(IIterableFile file, ref long sum) { foreach (var p in file.Children) { if (p.Type == FileType.Directory) { var direc = p as Abstracts.Directory; if (direc?.Deleted == false) { if (direc.Name != ".." && direc.Name != ".") { TraverseAddNum(direc, ref sum); } } } else if (p.Type == FileType.RegularFile) { sum += p.Size; } } }
/// <summary> /// 通过Url参数获得子文件; /// </summary> /// <param name="part"></param> /// <param name="urlArgs"></param> /// <returns></returns> public static IFile GetFileByUrl(this Partition part, string[] urlArgs) { if (urlArgs == null) { return(null); } if (urlArgs.Length == 1 && string.IsNullOrEmpty(urlArgs[0])) { return(part); } IIterableFile fileNode = part; for (int index = 0; index < urlArgs.Length - 1; index++) { if (fileNode == null) { throw new FileNotFoundException($"Can't find file {urlArgs[index]}-{urlArgs.Aggregate((a,b) => $"{a}/{b}")}"); } fileNode = fileNode.Children.FirstOrDefault(p => p.Name == urlArgs[index]) as IIterableFile; } return(fileNode.Children.FirstOrDefault(p => p.Name == urlArgs[urlArgs.Length - 1])); }