/// <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.");
                }
            }));
        }
Beispiel #8
0
 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();
                }
            }));
        }