예제 #1
0
 public FileUpdater()
 {
     ThreadCount    = 0;
     UploaderThread = new Thread(new ThreadStart(() =>
     {
         while (!stop)
         {
             if (ThreadCount < MaxThreadCount)
             {
                 Models.FileChangeEvent e = Util.Global.FileUpdateQueue.GetAnEvent();
                 if (e != null)
                 {
                     FileProcessing.Add(e.ProcessingPath());
                     Interlocked.Increment(ref ThreadCount);
                     FileUpdaterProcesser processer = new FileUpdaterProcesser(e);
                     new Thread(new ThreadStart(processer.run)).Start();
                 }
             }
             Thread.Sleep(100);
             Util.Global.manualResetEvent.WaitOne();
         }
     }));
     UploaderThread.Start();
 }
 public Models.FileChangeEvent GetAnEvent()
 {
     lock (EventQueue)
     {
         if (EventQueue.Count != 0)
         {
             for (int i = 0; i < EventQueue.Count; ++i)
             {
                 Models.FileChangeEvent e = EventQueue.ElementAt(i);
                 if (!FileProcessing.isInProcessing(e.ProcessingPath()))
                 {
                     EventQueue.Remove(e);
                     return(e);
                 }
             }
             return(null);
         }
         else
         {
             Util.Global.manualResetEvent.Reset();
             return(null);
         }
     }
 }
        public void Add(Models.FileChangeEvent e)
        {
            lock (EventQueue)
            {
                if (e.Type == Models.FileChangeEvent.FileChangeType.ClientCreate)
                {
                    Models.FileChangeEvent eve = EventQueue.Find((f) =>
                    {
                        return(f.LocalPath.Equals(e.LocalPath));
                    });
                    if (eve == null)
                    {
                        EventQueue.Add(e);
                        Util.Global.manualResetEvent.Set();
                        return;
                    }
                    switch (eve.Type)
                    {
                    case Models.FileChangeEvent.FileChangeType.ClientDelete:
                        eve.Type = Models.FileChangeEvent.FileChangeType.ClientChange;
                        Util.Global.manualResetEvent.Set();
                        return;

                    case Models.FileChangeEvent.FileChangeType.ServerRename:
                    case Models.FileChangeEvent.FileChangeType.ServerRenameAndClientChange:
                    case Models.FileChangeEvent.FileChangeType.ServerRenameAndServerChange:
                        this.Add(new Models.FileChangeEvent(Models.FileChangeEvent.FileChangeType.ServerDelete, eve.OldLocalPath));
                        eve.Type = Models.FileChangeEvent.FileChangeType.ClientCreate;
                        Util.Global.manualResetEvent.Set();
                        return;

                    default:
                        eve.Type = Models.FileChangeEvent.FileChangeType.ClientCreate;
                        Util.Global.manualResetEvent.Set();
                        return;
                    }
                }
                else if (e.Type == Models.FileChangeEvent.FileChangeType.ClientChange)
                {
                    Models.FileChangeEvent eve1 = EventQueue.Find((f) =>
                    {
                        return(f.LocalPath.Equals(e.LocalPath));
                    });
                    Models.FileChangeEvent eve2 = EventQueue.Find((f) =>
                    {
                        return((f.Type == Models.FileChangeEvent.FileChangeType.ServerRename ||
                                f.Type == Models.FileChangeEvent.FileChangeType.ServerRenameAndClientChange ||
                                f.Type == Models.FileChangeEvent.FileChangeType.ServerRenameAndServerChange) &&
                               f.OldLocalPath.Equals(e.LocalPath));
                    });
                    if (eve2 != null)
                    {
                        eve2.Type = Models.FileChangeEvent.FileChangeType.ServerRenameAndClientChange;
                    }
                    if (eve1 != null)
                    {
                        switch (eve1.Type)
                        {
                        case Models.FileChangeEvent.FileChangeType.ClientCreate:
                        case Models.FileChangeEvent.FileChangeType.ClientChange:
                            Util.Global.manualResetEvent.Set();
                            return;

                        case Models.FileChangeEvent.FileChangeType.ClientRename:
                        case Models.FileChangeEvent.FileChangeType.ClientRenameAndClientChange:
                        case Models.FileChangeEvent.FileChangeType.ClientRenameAndServerChange:
                            eve1.Type = Models.FileChangeEvent.FileChangeType.ClientRenameAndClientChange;
                            Util.Global.manualResetEvent.Set();
                            return;

                        default:
                            eve1.Type = Models.FileChangeEvent.FileChangeType.ClientChange;
                            Util.Global.manualResetEvent.Set();
                            return;
                        }
                    }
                    if (eve1 == null && eve2 == null)
                    {
                        EventQueue.Add(e);
                    }
                    Util.Global.manualResetEvent.Set();
                    return;
                }
                else if (e.Type == Models.FileChangeEvent.FileChangeType.ClientRename)
                {
                    Models.FileChangeEvent eve1 = EventQueue.Find((f) =>
                    {
                        return(f.LocalPath.Equals(e.OldLocalPath));
                    });
                    Models.FileChangeEvent eve2 = EventQueue.Find((f) =>
                    {
                        return((f.Type == Models.FileChangeEvent.FileChangeType.ServerRename ||
                                f.Type == Models.FileChangeEvent.FileChangeType.ServerRenameAndClientChange ||
                                f.Type == Models.FileChangeEvent.FileChangeType.ServerRenameAndServerChange) &&
                               f.OldLocalPath.Equals(e.OldLocalPath));
                    });
                    if (eve2 != null)
                    {
                        if (eve2.Type == Models.FileChangeEvent.FileChangeType.ServerRename)
                        {
                            eve2.Type = Models.FileChangeEvent.FileChangeType.ClientRename;
                        }
                        else if (eve2.Type == Models.FileChangeEvent.FileChangeType.ServerRenameAndClientChange)
                        {
                            eve2.Type = Models.FileChangeEvent.FileChangeType.ClientRenameAndClientChange;
                        }
                        else
                        {
                            eve2.Type = Models.FileChangeEvent.FileChangeType.ClientRenameAndServerChange;
                        }
                        eve2.OldLocalPath = eve2.LocalPath;
                        eve2.OldCloudPath = eve2.CloudPath;
                        eve2.LocalPath    = e.LocalPath;
                        eve2.CloudPath    = e.CloudPath;
                    }
                    if (eve1 != null)
                    {
                        switch (eve1.Type)
                        {
                        case Models.FileChangeEvent.FileChangeType.ClientCreate:
                            eve1.LocalPath = e.LocalPath;
                            eve1.CloudPath = e.CloudPath;
                            Util.Global.manualResetEvent.Set();
                            return;

                        case Models.FileChangeEvent.FileChangeType.ClientChange:
                            eve1.Type         = Models.FileChangeEvent.FileChangeType.ClientRenameAndClientChange;
                            eve1.LocalPath    = e.LocalPath;
                            eve1.CloudPath    = e.CloudPath;
                            eve1.OldCloudPath = e.OldCloudPath;
                            eve1.OldLocalPath = e.OldLocalPath;
                            Util.Global.manualResetEvent.Set();
                            return;

                        case Models.FileChangeEvent.FileChangeType.ClientRename:
                        case Models.FileChangeEvent.FileChangeType.ClientRenameAndClientChange:
                        case Models.FileChangeEvent.FileChangeType.ClientRenameAndServerChange:
                            eve1.LocalPath = e.LocalPath;
                            eve1.CloudPath = e.CloudPath;
                            Util.Global.manualResetEvent.Set();
                            return;

                        case Models.FileChangeEvent.FileChangeType.ServerChange:
                            eve1.Type         = Models.FileChangeEvent.FileChangeType.ClientRenameAndServerChange;
                            eve1.LocalPath    = e.LocalPath;
                            eve1.CloudPath    = e.CloudPath;
                            eve1.OldCloudPath = e.OldCloudPath;
                            eve1.OldLocalPath = e.OldLocalPath;
                            Util.Global.manualResetEvent.Set();
                            return;

                        case Models.FileChangeEvent.FileChangeType.ServerDelete:
                            eve1.LocalPath = e.LocalPath;
                            eve1.CloudPath = e.CloudPath;
                            Util.Global.manualResetEvent.Set();
                            return;

                        default:
                            Util.Global.manualResetEvent.Set();
                            return;
                        }
                    }
                    if (eve1 == null && eve2 == null)
                    {
                        EventQueue.Add(e);
                    }
                    Util.Global.manualResetEvent.Set();
                    return;
                }
                else if (e.Type == Models.FileChangeEvent.FileChangeType.ClientDelete)
                {
                    Models.FileChangeEvent eve = EventQueue.Find((f) =>
                    {
                        return(f.LocalPath.Equals(e.LocalPath));
                    });
                    Models.FileChangeEvent eve2 = EventQueue.Find((f) =>
                    {
                        return((f.Type == Models.FileChangeEvent.FileChangeType.ServerRename ||
                                f.Type == Models.FileChangeEvent.FileChangeType.ServerRenameAndClientChange ||
                                f.Type == Models.FileChangeEvent.FileChangeType.ServerRenameAndServerChange) &&
                               f.OldLocalPath.Equals(e.LocalPath));
                    });
                    if (eve2 != null)
                    {
                        eve2.Type = Models.FileChangeEvent.FileChangeType.ClientDelete;
                    }
                    if (eve != null)
                    {
                        switch (eve.Type)
                        {
                        case Models.FileChangeEvent.FileChangeType.ClientCreate:
                        case Models.FileChangeEvent.FileChangeType.ServerDelete:
                            EventQueue.Remove(eve);
                            Util.Global.manualResetEvent.Set();
                            return;

                        case Models.FileChangeEvent.FileChangeType.ClientRename:
                        case Models.FileChangeEvent.FileChangeType.ClientRenameAndClientChange:
                        case Models.FileChangeEvent.FileChangeType.ClientRenameAndServerChange:
                            eve.Type      = Models.FileChangeEvent.FileChangeType.ClientDelete;
                            eve.CloudPath = eve.OldCloudPath;
                            eve.LocalPath = eve.OldLocalPath;
                            Util.Global.manualResetEvent.Set();
                            return;

                        default:
                            eve.Type = Models.FileChangeEvent.FileChangeType.ClientDelete;
                            Util.Global.manualResetEvent.Set();
                            return;
                        }
                    }
                    if (eve == null && eve2 == null)
                    {
                        EventQueue.Add(e);
                    }
                    Util.Global.manualResetEvent.Set();
                    return;
                }
                else if (e.Type == Models.FileChangeEvent.FileChangeType.ServerCreate)
                {
                    Models.FileChangeEvent eve = EventQueue.Find((f) =>
                    {
                        return(f.LocalPath.Equals(e.LocalPath));
                    });
                    if (eve == null)
                    {
                        EventQueue.Add(e);
                        Util.Global.manualResetEvent.Set();
                        return;
                    }
                    switch (eve.Type)
                    {
                    case Models.FileChangeEvent.FileChangeType.ClientCreate:
                        eve.Type = Models.FileChangeEvent.FileChangeType.ClientCreate;
                        Util.Global.manualResetEvent.Set();
                        return;

                    case Models.FileChangeEvent.FileChangeType.ClientChange:
                        eve.Type = Models.FileChangeEvent.FileChangeType.ClientChange;
                        Util.Global.manualResetEvent.Set();
                        return;

                    case Models.FileChangeEvent.FileChangeType.ServerDelete:
                        eve.Type = Models.FileChangeEvent.FileChangeType.ServerChange;
                        Util.Global.manualResetEvent.Set();
                        return;

                    default:
                        eve.Type = Models.FileChangeEvent.FileChangeType.ServerCreate;
                        Util.Global.manualResetEvent.Set();
                        return;
                    }
                }
                else if (e.Type == Models.FileChangeEvent.FileChangeType.ServerChange)
                {
                    Models.FileChangeEvent eve = EventQueue.Find((f) =>
                    {
                        return(f.LocalPath.Equals(e.LocalPath));
                    });
                    if (eve != null)
                    {
                        switch (eve.Type)
                        {
                        case Models.FileChangeEvent.FileChangeType.ClientCreate:
                            eve.Type = Models.FileChangeEvent.FileChangeType.ClientCreate;
                            Util.Global.manualResetEvent.Set();
                            return;

                        case Models.FileChangeEvent.FileChangeType.ClientChange:
                            eve.Type = Models.FileChangeEvent.FileChangeType.ClientChange;
                            Util.Global.manualResetEvent.Set();
                            return;

                        case Models.FileChangeEvent.FileChangeType.ClientRename:
                            eve.Type = Models.FileChangeEvent.FileChangeType.ClientRenameAndServerChange;
                            Util.Global.manualResetEvent.Set();
                            return;

                        case Models.FileChangeEvent.FileChangeType.ClientDelete:
                            eve.Type = Models.FileChangeEvent.FileChangeType.ServerChange;
                            Util.Global.manualResetEvent.Set();
                            return;

                        case Models.FileChangeEvent.FileChangeType.ServerRename:
                            eve.Type = Models.FileChangeEvent.FileChangeType.ServerRenameAndServerChange;
                            Util.Global.manualResetEvent.Set();
                            return;

                        default:
                            Util.Global.manualResetEvent.Set();
                            return;
                        }
                    }
                    EventQueue.Add(e);
                    Util.Global.manualResetEvent.Set();
                    return;
                }
                else if (e.Type == Models.FileChangeEvent.FileChangeType.ServerRename)
                {
                    Models.FileChangeEvent eve1 = EventQueue.Find((f) =>
                    {
                        return(f.LocalPath.Equals(e.OldLocalPath));
                    });
                    Models.FileChangeEvent eve2 = EventQueue.Find((f) =>
                    {
                        return(f.Type == Models.FileChangeEvent.FileChangeType.ClientCreate &&
                               f.LocalPath.Equals(e.LocalPath));
                    });
                    if (eve2 != null)
                    {
                        this.Add(new Models.FileChangeEvent(Models.FileChangeEvent.FileChangeType.ServerDelete, e.OldLocalPath));
                    }
                    if (eve1 != null)
                    {
                        switch (eve1.Type)
                        {
                        case Models.FileChangeEvent.FileChangeType.ClientChange:
                            eve1.Type      = Models.FileChangeEvent.FileChangeType.ServerRenameAndClientChange;
                            eve1.LocalPath = e.LocalPath;
                            eve1.CloudPath = e.CloudPath;
                            Util.Global.manualResetEvent.Set();
                            return;

                        case Models.FileChangeEvent.FileChangeType.ClientRename:
                            eve1.Type         = Models.FileChangeEvent.FileChangeType.ServerRename;
                            eve1.OldCloudPath = eve1.CloudPath;
                            eve1.OldLocalPath = eve1.LocalPath;
                            eve1.CloudPath    = e.CloudPath;
                            eve1.LocalPath    = e.LocalPath;
                            Util.Global.manualResetEvent.Set();
                            return;

                        case Models.FileChangeEvent.FileChangeType.ClientRenameAndClientChange:
                            eve1.Type         = Models.FileChangeEvent.FileChangeType.ServerRenameAndClientChange;
                            eve1.OldCloudPath = eve1.CloudPath;
                            eve1.OldLocalPath = eve1.LocalPath;
                            eve1.CloudPath    = e.CloudPath;
                            eve1.LocalPath    = e.LocalPath;
                            Util.Global.manualResetEvent.Set();
                            return;

                        case Models.FileChangeEvent.FileChangeType.ClientRenameAndServerChange:
                            eve1.Type         = Models.FileChangeEvent.FileChangeType.ServerRenameAndServerChange;
                            eve1.OldCloudPath = eve1.CloudPath;
                            eve1.OldLocalPath = eve1.LocalPath;
                            eve1.CloudPath    = e.CloudPath;
                            eve1.LocalPath    = e.LocalPath;
                            Util.Global.manualResetEvent.Set();
                            return;

                        case Models.FileChangeEvent.FileChangeType.ClientDelete:
                        case Models.FileChangeEvent.FileChangeType.ServerCreate:
                        case Models.FileChangeEvent.FileChangeType.ServerRename:
                        case Models.FileChangeEvent.FileChangeType.ServerRenameAndClientChange:
                        case Models.FileChangeEvent.FileChangeType.ServerRenameAndServerChange:
                            eve1.LocalPath = e.LocalPath;
                            eve1.CloudPath = e.CloudPath;
                            Util.Global.manualResetEvent.Set();
                            return;

                        case Models.FileChangeEvent.FileChangeType.ServerChange:
                            eve1.Type      = Models.FileChangeEvent.FileChangeType.ServerRenameAndServerChange;
                            eve1.LocalPath = e.LocalPath;
                            eve1.CloudPath = e.CloudPath;
                            Util.Global.manualResetEvent.Set();
                            return;

                        default:
                            Util.Global.manualResetEvent.Set();
                            return;
                        }
                    }
                    if (eve1 == null && eve2 == null)
                    {
                        EventQueue.Add(e);
                    }
                    Util.Global.manualResetEvent.Set();
                    return;
                }
                else if (e.Type == Models.FileChangeEvent.FileChangeType.ServerDelete)
                {
                    Models.FileChangeEvent eve = EventQueue.Find((f) =>
                    {
                        return(f.LocalPath.Equals(e.LocalPath));
                    });
                    if (eve != null)
                    {
                        switch (eve.Type)
                        {
                        case Models.FileChangeEvent.FileChangeType.ClientCreate:
                        case Models.FileChangeEvent.FileChangeType.ClientChange:
                            Util.Global.manualResetEvent.Set();
                            return;

                        case Models.FileChangeEvent.FileChangeType.ClientRename:
                        case Models.FileChangeEvent.FileChangeType.ClientRenameAndClientChange:
                        case Models.FileChangeEvent.FileChangeType.ClientRenameAndServerChange:
                        case Models.FileChangeEvent.FileChangeType.ServerChange:
                            eve.Type = Models.FileChangeEvent.FileChangeType.ServerDelete;
                            Util.Global.manualResetEvent.Set();
                            return;

                        case Models.FileChangeEvent.FileChangeType.ClientDelete:
                        case Models.FileChangeEvent.FileChangeType.ServerCreate:
                            EventQueue.Remove(eve);
                            Util.Global.manualResetEvent.Set();
                            return;

                        case Models.FileChangeEvent.FileChangeType.ServerRename:
                        case Models.FileChangeEvent.FileChangeType.ServerRenameAndClientChange:
                        case Models.FileChangeEvent.FileChangeType.ServerRenameAndServerChange:
                            eve.Type      = Models.FileChangeEvent.FileChangeType.ServerDelete;
                            eve.LocalPath = eve.OldLocalPath;
                            eve.CloudPath = eve.OldCloudPath;
                            Util.Global.manualResetEvent.Set();
                            return;

                        case Models.FileChangeEvent.FileChangeType.ServerDelete:
                        default:
                            Util.Global.manualResetEvent.Set();
                            return;
                        }
                    }
                    EventQueue.Add(e);
                    Util.Global.manualResetEvent.Set();
                    return;
                }
            }
        }
예제 #4
0
 public FileUpdaterProcesser(Models.FileChangeEvent e)
 {
     this.e = e;
 }
 private void OnDelete(object sender, FileSystemEventArgs e)
 {
     Models.FileChangeEvent fce = new Models.FileChangeEvent(Models.FileChangeEvent.FileChangeType.ClientDelete, e.FullPath);
     Util.Global.FileUpdateQueue.Add(fce);
     OnFileChange(null, null);
 }
 private void OnRename(object sender, RenamedEventArgs e)
 {
     Models.FileChangeEvent fce = new Models.FileChangeEvent(Models.FileChangeEvent.FileChangeType.ClientRename, e.FullPath, e.OldFullPath);
     Util.Global.FileUpdateQueue.Add(fce);
     OnFileChange(null, null);
 }
예제 #7
0
        public static void CheckConsistency(string folder)
        {
            string[] dirs  = Directory.GetDirectories(folder);
            string[] files = Directory.GetFiles(folder);
            List <Models.Metadata> cloudEntries = BackgroundWorks.NetworkManager.ListFolder(LocalPathtoCloudPath(folder));
            List <Models.Metadata> cloudDirs    = new List <Models.Metadata>();
            List <Models.Metadata> cloudFiles   = new List <Models.Metadata>();

            foreach (Models.Metadata metadata in cloudEntries)
            {
                if (metadata.Tag.Equals("Folder"))
                {
                    cloudDirs.Add(metadata);
                }
                else
                {
                    cloudFiles.Add(metadata);
                }
            }
            foreach (Models.Metadata metadata in cloudDirs)
            {
                string LocalPath = CloudPathtoLocalPath(metadata.FullPath);
                if (!dirs.Contains(LocalPath))
                {
                    if (metadata.Modifier.Equal(Util.Global.user))
                    {
                        Models.FileChangeEvent fce = new Models.FileChangeEvent(Models.FileChangeEvent.FileChangeType.ClientDelete, LocalPath);
                        Util.Global.FileUpdateQueue.Add(fce);
                    }
                    else
                    {
                        DownloadFolder(LocalPath);
                    }
                }
            }
            foreach (string dir in dirs)
            {
                if (cloudDirs.Find((d) =>
                {
                    return(LocalPathtoCloudPath(dir).Equals(d.FullPath));
                }) == null)
                {
                    if (SqliteHelper.Select(dir) == null)
                    {
                        UploadFolder(dir);
                    }
                    else
                    {
                        DeleteFolder(dir);
                    }
                }
                else
                {
                    CheckConsistency(dir);
                }
            }
            foreach (Models.Metadata metadata in cloudFiles)
            {
                string LocalPath = CloudPathtoLocalPath(metadata.FullPath);
                if (!files.Contains(LocalPath))
                {
                    if (metadata.Modifier.Equal(Util.Global.user))
                    {
                        Models.FileChangeEvent fce = new Models.FileChangeEvent(Models.FileChangeEvent.FileChangeType.ClientDelete, LocalPath);
                        Util.Global.FileUpdateQueue.Add(fce);
                    }
                    else
                    {
                        Models.FileChangeEvent fce = new Models.FileChangeEvent(Models.FileChangeEvent.FileChangeType.ServerCreate, LocalPath);
                        Util.Global.FileUpdateQueue.Add(fce);
                    }
                }
            }
            foreach (string file in files)
            {
                Models.Metadata metadata;
                if ((metadata = cloudFiles.Find((d) =>
                {
                    return(LocalPathtoCloudPath(file).Equals(d.FullPath));
                })) == null)
                {
                    if (SqliteHelper.Select(file) == null)
                    {
                        Models.FileChangeEvent fce = new Models.FileChangeEvent(Models.FileChangeEvent.FileChangeType.ClientCreate, file);
                        Util.Global.FileUpdateQueue.Add(fce);
                    }
                    else
                    {
                        Models.FileChangeEvent fce = new Models.FileChangeEvent(Models.FileChangeEvent.FileChangeType.ServerDelete, file);
                        Util.Global.FileUpdateQueue.Add(fce);
                    }
                }
                else
                {
                    DateTime           LocalTime = new FileInfo(file).LastWriteTimeUtc;
                    DateTime           CloudTime = metadata.ModifiedTime;
                    Models.SQLDataType sqlData   = SqliteHelper.Select(file);
                    if (sqlData == null)
                    {
                        Models.FileChangeEvent fce = new Models.FileChangeEvent(Models.FileChangeEvent.FileChangeType.ClientCreate, file);
                        Util.Global.FileUpdateQueue.Add(fce);
                    }
                    else
                    {
                        DateTime LastCloudTime = sqlData.getModifiedTime();
                        if (LocalTime > LastCloudTime)
                        {
                            Models.FileChangeEvent fce = new Models.FileChangeEvent(Models.FileChangeEvent.FileChangeType.ClientChange, file);
                            Util.Global.FileUpdateQueue.Add(fce);
                        }
                        else
                        {
                            if (CloudTime > LastCloudTime)
                            {
                                Models.FileChangeEvent fce = new Models.FileChangeEvent(Models.FileChangeEvent.FileChangeType.ServerChange, file);
                                Util.Global.FileUpdateQueue.Add(fce);
                            }
                        }
                    }
                }
            }
        }