/// <summary> /// Get system path of disk. /// </summary> /// <param name="Disk"></param> /// <returns>null if not in this device</returns> public static string GetDiskPath(MyDisk Disk) { DriveInfo[] drives = DriveInfo.GetDrives(); foreach (DriveInfo d in drives) { try { TextReader read = new StreamReader(new FileInfo(String.Format("{0}\\.{1}.info", d.RootDirectory.FullName, Properties.Settings.Default.HFOFolderName)).OpenRead()); try { string line = read.ReadLine(); while (line != null) { if (line.StartsWith("diskId")) { if (Disk.Id == ulong.Parse(line.Split(new char[] { '=' })[1])) { return(d.RootDirectory.FullName); } } line = read.ReadLine(); } } finally { read.Dispose(); } } catch (IOException) { } catch (ArgumentNullException) { } catch (ArgumentException) { } } return(null); }
/// <summary> /// Add from this device to application data. /// </summary> /// <param name="path">System path od adding file.</param> /// <param name="category">Category of file</param> /// <returns></returns> public Task AddFile(string path, Category category) { dataHolder.Load(); return(Task.Run(() => { FileInfo info = new FileInfo(path); MyDevice device = GetLocalDeviceInstance(); MyDisk disk = GetDiskInstance(info); MyFile f = disk.AddFile(path, category, syncManager); syncManager.AddGeneratedSyncEvent(new FileAddEv(new FilesEvents(disk.Id, device.Id, f.FilePath), category, f.InfoFilePath)); })); }
/// <summary> /// Add to application local drives, and create .HFO.info in each. /// </summary> internal void AddLocalDiskToManager(MyDevice dev) { bool addFailed; foreach (var d in DriveInfo.GetDrives()) { addFailed = false; MyDisk disk = dev.AddDisk(d.Name); try { try { var w = new StreamWriter(new FileStream( String.Format("{0}\\.{1}.info", d.RootDirectory.FullName, Properties.Settings.Default.HFOFolderName) , FileMode.CreateNew, System.Security.AccessControl.FileSystemRights.Modify, FileShare.None, 1024, FileOptions.None)); try { w.WriteLine("diskId={0}", disk.Id); } finally { w.Dispose(); } }catch (IOException ex) { //Disk j*z obsahuje .HFO.info ulong id = GetDiskId(d.RootDirectory); disk.Id = id; } } catch (UnauthorizedAccessException e) { addFailed = true; dev.Remove(disk); } catch (IOException e) { addFailed = true; dev.Remove(disk); } if (!addFailed) { syncManager.AddGeneratedSyncEvent(new DiskAddEv(disk, this)); } } dev.RewriteDeviceFile(); foreach (var d in dev.disks) { Directory.CreateDirectory(String.Format("{0}\\FileInfo\\{1}\\Folder", FileManager.PathToHFOFolder, d.Id)); Directory.CreateDirectory(String.Format("{0}\\FileInfo\\{1}\\File", FileManager.PathToHFOFolder, d.Id)); Directory.CreateDirectory(String.Format("{0}\\FileInfo\\{1}\\ItemFiles", FileManager.PathToHFOFolder, d.Id)); } dataHolder.RewriteOverviewFile(); }
/// <summary> /// As <see cref="FileManager.GetDiskId(DirectoryInfo)"/>, only extended about selecting <see cref="Classes.MyDisk"/> instance form <see cref="FileManager.dataHolder"/> by id. /// </summary> public MyDisk GetDiskInstance(DirectoryInfo dir) { try { var x = GetDiskId(dir); MyDisk disk = dataHolder.devices.Find(i => i.Id == Properties.Settings.Default.localDevId). disks.Find(i => i.Id == x); return(disk); } catch (NullReferenceException e) { throw new Exceptions.DeviceSystemException("Missing information in info file.", e); } }
/// <summary> /// /// </summary> /// <param name="file">file path, only file name</param> /// <returns></returns> public static List <MyDevice> readOverview(string file) { List <MyDevice> dil = new List <MyDevice>(); XmlTextReader reader = new XmlTextReader(Managers.FileManager.PathToHFOFolder + "\\" + file); try { MyDevice computer = null; while (reader.Read()) { switch (reader.NodeType) { case XmlNodeType.Element: switch (reader.Name) { case "disk": if (computer != null) { MyDisk disk = new MyDisk(ulong.Parse(reader.GetAttribute("deviceId")), reader.GetAttribute("name")); computer.disks.Add(disk); } else { MyDevice device = new MyDevice(ulong.Parse(reader.GetAttribute("deviceId")), reader.GetAttribute("name"), Communication.PeriferDisk, reader.GetAttribute("syncedTo"), reader.GetAttribute("runOn"), reader.GetAttribute("deviceFile")); MyDisk disk = new MyDisk(device.Id, device.Name); device.disks.Add(disk); dil.Add(device); } break; case "computer": computer = new MyDevice(ulong.Parse(reader.GetAttribute("deviceId")), reader.GetAttribute("name"), Communication.Network, reader.GetAttribute("syncedTo"), reader.GetAttribute("runOn"), reader.GetAttribute("deviceFile")); dil.Add(computer); break; } break; case XmlNodeType.EndElement: if (reader.Name == "computer") { computer = null; } break; } } } finally { reader.Dispose(); } return(dil); }
/// <summary> /// /// </summary> /// <param name="oldAppTreePath"></param> /// <param name="newAppTreePath"></param> /// <param name="removeOld"></param> /// <returns></returns> public Task <MyFile> PathChanged(string oldAppTreePath, string newAppTreePath, bool removeOld) { dataHolder.Load(); return(Task.Run <MyFile>(() => { var sO = oldAppTreePath.Split(new char[] { '\\' }, 3); var oldEnd = dataHolder.Select(sO[0], sO[1]).GetFile(sO[2]); var sN = newAppTreePath.Split(new char[] { '\\' }, 3); MyDisk d = dataHolder.Select(sN[0], sN[1]); MyFile f = d.AddFile(sN[2], oldEnd); if (removeOld) { dataHolder.Select(sO[0], sO[1]).RemoveFile(sO[2]); } return f; })); }
/// <summary> /// Go down through my system tree and get Folder(or File) at the end of path <paramref name="s"/> /// </summary> /// <returns>Running task thats result is founded Folder(or File).</returns> public Task <Classes.Interfaces.IInfoGetter> GetPathEnd(string s) { return(Task <Classes.Interfaces.IInfoGetter> .Run <Classes.Interfaces.IInfoGetter>(() => { Classes.Interfaces.IInfoGetter foundedEnd = null; int i = s.IndexOf('\\'); ulong diskId = ulong.Parse(s.Substring(0, i)); s = s.Remove(0, i); string realtiveDisk = s; MyDisk d = null; foreach (MyDevice di in dataHolder.devices) { d = di.disks.Find((x) => { return x.Id == diskId; }); if (d != null) { di.LoadDisks(); break; } } foundedEnd = d.files.Find((x) => { return x.FilePath == realtiveDisk; }); if (foundedEnd != null) { return foundedEnd; } else { Classes.Interfaces.IInfoGetter result = null; foreach (MyFolder f in d.folders) { if (s.StartsWith(f.Path)) { result = f.GetEnd(s.Remove(0, f.Path.Length), realtiveDisk); } if (result != null) { return result; } } throw new Exceptions.DeviceSystemException("Wrong path through my system tree."); } })); }
public DiskAddEv(MyDisk d, FileManager fm) { DeviceId = fm.dataHolder.GetDevice(d).Id; DiskId = d.Id; DiskName = d.Name; }
/// <summary> /// Read information from device info file to instance of DeviceInfo /// </summary> /// <exception cref="HomeFileOrganizer.Exceptions.DeviceFileException"></exception> /// <param name="file"></param> /// <returns></returns> public static Task readDeviceFile(string file, MyDevice device) { return(Task.Run(() => { MyDisk disk = null; var hiddenrStream = new System.IO.FileInfo(Managers.FileManager.PathToHFOFolder + "\\DeviceInfos\\" + file).Open(System.IO.FileMode.Open); XmlReader reader = XmlTextReader.Create(hiddenrStream, new XmlReaderSettings() { Async = true }); try { Stack <MyFolder> folderStack = new Stack <MyFolder>(); while (reader.Read()) { switch (reader.NodeType) { case XmlNodeType.Element: switch (reader.Name) { case "disk": disk = device.disks.Find(i => i.Id == UInt64.Parse(reader.GetAttribute("id"))); if (disk == null) { throw new Exceptions.DeviceFileException(String.Format("Not compatible overview file and device file {0}. Id {1} not found in overview file.", file, reader.GetAttribute("id"))); } break; case "file": MyFile actFile; if (folderStack.Count != 0) { actFile = new MyFile(folderStack.Peek()); } else { actFile = new MyFile(new MyRootFolder("", disk, null)); } String infoFileName = reader.GetAttribute("infoFile"); if (infoFileName != null) { actFile.InfoFilePath = String.Format("\\FileInfo\\{0}\\File\\{1}", disk.Id, infoFileName); } actFile.Category = selectCategory(reader.GetAttribute("category")); if (folderStack.Count == 0) { actFile.FilePath = reader.GetAttribute("path"); disk.files.Add(actFile); } else { actFile.FilePath = folderStack.Peek().Path + reader.GetAttribute("path"); folderStack.Peek().files.Add(actFile); } break; case "folder": MyFolder actFolder = null; if (folderStack.Count == 0) { actFolder = new MyRootFolder(reader.GetAttribute("path"), disk, selectCategory(reader.GetAttribute("category"))); disk.folders.Add((MyRootFolder)actFolder); } else { actFolder = new MyFolder(reader.GetAttribute("path")); actFolder.UpperFolder = folderStack.Peek(); folderStack.Peek().folders.Add(actFolder); } String infoFilePath2 = reader.GetAttribute("infoFile"); if (infoFilePath2 != null) { actFolder.InfoFilePath = String.Format("\\FileInfo\\{0}\\Folder\\{1}", disk.Id, infoFilePath2); } folderStack.Push(actFolder); break; } break; case XmlNodeType.EndElement: switch (reader.Name) { case "folder": folderStack.Pop(); break; } break; } } } finally { reader.Dispose(); hiddenrStream.Dispose(); } })); }