/// <summary>Copy a file from EFS to the specified System.Stream.</summary> /// <remarks>Unlike the rest of the code in this class, this method is safe to call from any thread.</remarks> /// <param name="sOutput"></param> /// <param name="idFile"></param> void CopyFileToStream(Stream sOutput, int idFile) { using (var s = pool.GetSession()) using (var trans = s.BeginTransaction()) { var e = EFS.byId(rs, idFile); if (null == e) { throw new FileNotFoundException(); } using (var sInput = e.data.Read(rs.cursor)) EFS.CopyStream(sInput, sOutput); } }
/// <summary>Iterate over the selected files and folders.</summary> /// <param name="itemIds">Selected item IDs.</param> /// <param name="actFile">Will be called for every file in the selection, including the files in a sumbolders.</param> /// <param name="actFolder">Will be called for every folder in the selection.</param> void IterateSelection(IEnumerable <int> itemIds, Action <EfsEntry, string> actFile, Action <EfsEntry, string> actFolder) { foreach (int idFile in itemIds) { EfsEntry ee = EFS.byId(rs, idFile); if (ee.isDirectory) { actFolder(ee, ee.name); var pending = new Queue <Tuple <string, int> >(); pending.Enqueue(Tuple.Create(ee.name, ee.id)); while (pending.Count > 0) { var p = pending.Dequeue(); foreach (EfsEntry eChild in EFS.ListChildren(rs, p.Item2)) { string path = Path.Combine(p.Item1, eChild.name); if (eChild.isDirectory) { pending.Enqueue(Tuple.Create(path, eChild.id)); actFolder(eChild, path); } else { actFile(eChild, path); } } } } else { actFile(ee, ee.name); } } }
private void list_MouseDoubleClick(object sender, MouseEventArgs e) { var fi = list.FocusedItem; if (null == fi || null == fi.Tag) { return; } int idFile = (int)(fi.Tag); EfsEntry eFile = EFS.byId(rs, idFile); if (eFile.isDirectory) { if (!nodeCurrent.IsExpanded) { nodeCurrent.Expand(); } tree.SelectedNode = nodeCurrent.Nodes.All() .Where(n => n.Tag != null && (int)n.Tag == idFile) .FirstOrDefault(); } }