/// <summary> /// /// </summary> /// <param name="path">start with root dir</param> /// <param name="category"></param> /// <returns>null if already exist</returns> internal MyFile AddFile(string path, Category category, Managers.Synchronization syncer) { FileInfo file = new FileInfo(path); string HFOPath = String.Format("\\FileInfo\\{0}\\File", Id); string filePath = path.Remove(0, file.Directory.Root.Name.Length - 1); var foundfile = files.Find(i => { return(i.FilePath == filePath); }); if (foundfile != null) { return(null); } MyFile f = new MyFile(category.GetMyFileInfoForFile(Id)); f.Category = category; f.FilePath = filePath; if (files.Count > 0) { f.Folder = files[0].Folder; } else { f.Folder = new MyRootFolder("", this, null); } InfoChangeEvents eventBase = new InfoChangeEvents(DateTime.Now, f.GetPath()); //set system variables var it = f.MyInfoFile.GetItem("system\\name"); if (it != null) { it.SetValue(file.Name); syncer.AddGeneratedSyncEvent(new InfoChangeValueEv(it.GetChangeInfoSyncString(), it.GetGroupPath(), eventBase)); } it = f.MyInfoFile.GetItem("system\\size"); if (it != null) { it.SetValue(file.Length.ToString()); syncer.AddGeneratedSyncEvent(new InfoChangeValueEv(it.GetChangeInfoSyncString(), it.GetGroupPath(), eventBase)); } it = f.MyInfoFile.GetItem("system\\last change"); if (it != null) { it.SetValue(file.LastWriteTime.ToString(System.Globalization.CultureInfo.InvariantCulture)); syncer.AddGeneratedSyncEvent(new InfoChangeValueEv(it.GetChangeInfoSyncString(), it.GetGroupPath(), eventBase)); } it = f.MyInfoFile.GetItem("system\\creation"); if (it != null) { it.SetValue(file.CreationTime.ToString(System.Globalization.CultureInfo.InvariantCulture)); syncer.AddGeneratedSyncEvent(new InfoChangeValueEv(it.GetChangeInfoSyncString(), it.GetGroupPath(), eventBase)); } FileInfo infoFile = Managers.FileManager.CreateNewFile(new DirectoryInfo(Managers.FileManager.PathToHFOFolder + HFOPath), ".xml"); f.InfoFilePath = String.Format("{0}\\{1}", HFOPath, infoFile.Name); StreamWriter w = new StreamWriter(new FileStream(infoFile.FullName, FileMode.Create)); try { f.MyInfoFile.RewriteFile(w); } finally { w.Dispose(); } files.Add(f); return(f); }
/// <summary> /// read events from sync file /// </summary> /// <param name="fileFullLocalPath"></param> /// <returns>key value pair ther key is version of sync file and value is list of events</returns> public static async Task <KeyValuePair <string, List <Events> > > readSyncFile(System.IO.TextReader fileFullLocalPath) { XmlReader reader = XmlTextReader.Create(fileFullLocalPath, new XmlReaderSettings() { Async = true }); try { string version = ""; List <Events> list = new List <Events>(); FilesEvents fileEvent = null; ConfirmEvents confirmEvent = null; InfoChangeEvents infoEvent = null; InfoChangeValueEv cve = null; while (await reader.ReadAsync()) { switch (reader.NodeType) { case XmlNodeType.Element: switch (reader.Name) { case "versionStamp": version = reader.GetAttribute("id"); break; case FilesEvents.Xml: fileEvent = new FilesEvents(reader); break; //file commands start case FileAddEv.Xml: list.Add(new FileAddEv(fileEvent, reader)); break; case FileMoveEv.Xml: list.Add(new FileMoveEv(fileEvent, reader)); break; case FileRemoveEvent.Xml: list.Add(new FileRemoveEvent(fileEvent, reader)); break; case FileDeleteEv.Xml: list.Add(new FileDeleteEv(fileEvent, reader)); break; //file commands end case ConfirmEvents.Xml: confirmEvent = new ConfirmEvents(reader); break; //confirm command start case FileMovedEv.Xml: list.Add(new FileMovedEv(confirmEvent, reader)); break; //confirm command end case InfoChangeEvents.Xml: infoEvent = new InfoChangeEvents(reader); break; //info changes start case InfoChangeValueEv.Xml: cve = new InfoChangeValueEv("", reader, infoEvent); break; //info changes end case DeviceAddEv.Xml: list.Add(new DeviceAddEv(reader)); break; case DiskAddEv.Xml: list.Add(new DiskAddEv(reader)); break; } break; case XmlNodeType.EndElement: switch (reader.Name) { case FilesEvents.Xml: fileEvent = null; break; case ConfirmEvents.Xml: confirmEvent = null; break; case InfoChangeEvents.Xml: infoEvent = null; break; case InfoChangeValueEv.Xml: cve = null; break; } break; case XmlNodeType.CDATA: if (cve != null) { list.Add(new InfoChangeValueEv(reader.Value, cve)); } break; } } return(new KeyValuePair <string, List <Events> >(version, list)); } finally { reader.Dispose(); } }