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; } } }
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); }
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); } } } } } }