void synchfolders(BaseFolder srcFolder, FSObjectEvents eventtype) { Dispatcher.BeginInvoke(new Action(() => { v_curdir = v_curdir; }), null); }
internal void Delete(FSObjectEvents eventtype) { foreach (var f in Files) FS.Delete(f, eventtype); foreach (var it in Folders) FS.Delete(it,eventtype); if (Directory.Exists(RealPath)) Directory.Delete(RealPath,true); if (Directory.Exists(MetaPath)) Directory.Delete(MetaPath, true); }
void FileSystem_OnFileEvent(BaseFile srcFile, FSObjectEvents eventtype) { lock (RemoteClients) { if (yNotRule.RulePool.ContainsKey(eventtype)) foreach (var r in yNotRule.RulePool[eventtype]) r.Eval(this, srcFile); } ///блокировки файлов и т д if (eventtype == FSObjectEvents.local_changed) { Log(LogLevel.Info, "Отправка обновленной метаинформации"); Environment.SendToAll(new UpdateMetaInfoMessage(srcFile)); } if (eventtype == FSObjectEvents.local_opend) { Environment.SendToAll(new LockFileMessage(srcFile)); if (!srcFile.data.Downloaded) { ///файл не загружен - выбираем слуйчайную реплику ///загружаем файл ///добавляем себя в реплики ///сообщаем об изменении метаинформации var r = GetRandomReplica(srcFile); if (r == null) throw new Exception("Не найдены релики"); var m = new EventWaitHandle(false, EventResetMode.AutoReset); (r as RemoteClient).Send(new DownloadFileMessage(srcFile, m)); m.WaitOne(-1); srcFile.AddReplica(Id); Log(NLog.LogLevel.Info, "Получена реплика файла {0}", this); FileSystem_OnFileEvent(srcFile, FSObjectEvents.local_changed); } } if (eventtype == FSObjectEvents.local_changed || eventtype == FSObjectEvents.remote_changed) { ///если хэши не совпадают (и реплика загружена), обновить реплику ///OR ///если я в репликах - я дожен загузить этот файл /// // if () if ((srcFile.data.Downloaded && srcFile.data.ComputeHash() != srcFile.meta.Hash) || (GetFileReplics(srcFile).Contains(this) && !srcFile.data.Downloaded)) { Log(LogLevel.Info, "Файл изменен. Инициирую обновление {0}", srcFile); var m = new EventWaitHandle(false, EventResetMode.AutoReset); Log(LogLevel.Info, "Загружаю реплику {0}", srcFile.Name); (GetFileOwner(srcFile) as RemoteClient).Send(new DownloadFileMessage(srcFile, m)); //m.WaitOne(-1); } Log(LogLevel.Info, "Обновлена метаинформация для файла {0}", srcFile.Name); } if (eventtype == FSObjectEvents.local_closed) { ///сравнить хэш ///если совпадает - файл не изменен. просто разлокируем его ///если нет - ставим себя влядельцем файла и рассылаем всем новую метаинфу. ///те должны сравнить хэш и загрузить файл. ///после этого файл можно разблокировать /// var oldhash = srcFile.meta.Hash; var newhash = srcFile.data.ComputeHash(); if (oldhash != newhash) { srcFile.SetHash(newhash); srcFile.SetOwner(Id); FileSystem_OnFileEvent(srcFile, FSObjectEvents.local_changed); // ParentFolder.FS.ParentClient.Environment.SendToAll(new UpdateMetaInfoMessage(this)); } Environment.SendToAll(new UnLockFileMessage(srcFile)); } }
void FileSystem_OnFolderEvent(BaseFolder srcFolder, FSObjectEvents eventtype) { if (eventtype == FSObjectEvents.local_created) { Log(LogLevel.Info, "Шлем команду \"создать папку {0}\"", srcFolder.Name); Environment.SendToAll(new NewFolderMessage(srcFolder)); } if (eventtype == FSObjectEvents.local_delete) { Log(LogLevel.Info, "Шлем команду \"удалить папку {0}\"", srcFolder.Name); Environment.SendToAll(new DeleteFSObjMessage(srcFolder)); } }
public virtual void OnFolderEventHandled(BaseFolder srcFolder, FSObjectEvents eventtype) { ///передача агрегированных событий if (OnFolderEvent != null) OnFolderEvent(srcFolder, eventtype); }
public virtual void OnFileEventHandled(BaseFile srcFile, FSObjectEvents eventtype) { //if (ReadOnly && eventtype == FSObjectEvents.remote_create) // throw new Exception("Can not create file on readonly mode"); ///подписываемся на события каждого нового файла if (eventtype == FSObjectEvents.local_created || eventtype == FSObjectEvents.remote_create) srcFile.OnFileEvent += OnFileEventHandled; ///передача агрегированных событий if (OnFileEvent != null) OnFileEvent(srcFile, eventtype); }
public IFSObject Delete(IFSObject iFSObject, FSObjectEvents eventtype) { // if (ReadOnly) return null; lock (RootDir.FS) { ///check exists /// if (Find(iFSObject.RelativePath) == null) { throw new Exception(string.Format("Cant found {0} ", iFSObject.Name)); return null; } if (iFSObject is BaseFile) (iFSObject as BaseFile).Delete(); if (iFSObject is BaseFolder) { var its = (iFSObject as BaseFolder).Items; while (its.Count > 0) Delete(its[0], eventtype); (iFSObject as BaseFolder).Delete(eventtype); } //remove sourcelist fs if (iFSObject is BaseFile) { var f = iFSObject as BaseFile; f.ParentFolder.Files.Remove(f); } else if (iFSObject is BaseFolder) { var f = iFSObject as BaseFolder; (f.ParentFolder as BaseFolder).Folders.Remove(f); } if (iFSObject is BaseFile) if (_OnFileEvent != null) _OnFileEvent(iFSObject as BaseFile, eventtype); if (iFSObject is BaseFolder) if (_OnFolderEvent != null) _OnFolderEvent(iFSObject as BaseFolder, eventtype); return iFSObject; } }
/// <summary> /// CreateFolder folders without subfolders /// </summary> /// <param name="ParentFolder">parent folder</param> /// <param name="FolderName">folder name only (or '\\' for root)</param> /// <param name="CreationType">type of folder creatinon (by local or by remote)</param> /// <returns></returns> public BaseFolder CreateFolder(BaseFolder ParentFolder, string FolderName, FSObjectEvents CreationType) { // if (ReadOnly) return null; if (!string.IsNullOrEmpty(FolderName) && FolderName.Length > 0 && FolderName != "\\" && FolderName[0] == '\\') FolderName = FolderName.Substring(1); if (FolderName.Contains("\\") || FolderName.Contains("/")) { var g = FolderName.Split('\\').ToList(); while (g.Count > 0) { var pfold = Path.Combine(ParentFolder.RelativePath, g[0]); var tmpfold = FindFSObjByRelativePath(pfold, ParentFolder) as BaseFolder; if (tmpfold == null) ParentFolder = CreateFolder(ParentFolder, g[0], CreationType); else ParentFolder = tmpfold; g.RemoveAt(0); } } var realdir = Path.Combine(ParentFolder.RealPath, FolderName); if (Directory.Exists(realdir)) { //Delete(dirtodel, FSObjectEvents.local_delete); throw new Exception(string.Format("Folder {0} exists!", FolderName)); return Find(FolderName) as BaseFolder; } //create real //create meta try { lock (ParentFolder.FS) { var f = ParentFolder.CreateFolder(FolderName); ParentFolder.Folders.Add(f); if (_OnFolderEvent != null) _OnFolderEvent(f, CreationType); return f; } } catch (Exception) { //ParentClient.Log(NLog.LogLevel.Error, ex.Message); return null; } }
/// <summary> /// Add file by metafileinfo /// </summary> /// <param name="ParentFolder">Direactory to move new file</param> /// <param name="MetaFile">new file meta information</param> /// <returns></returns> public BaseFile AddFile(BaseFolder ParentFolder, FileMetaInfo MetaFile, FSObjectEvents FileEventType) { // if (ReadOnly) return null; lock (ParentFolder.FS) { var metapath = Path.Combine(ParentFolder.MetaPath, MetaFile.Name); if (File.Exists(metapath)) throw new Exception(string.Format("Файл \"{0}\" уже существует!", metapath));// return null; var f = new BaseFile(ParentFolder, MetaFile); ParentFolder.Files.Add(f); //add to files if (_OnFileEvent != null) _OnFileEvent(f, FileEventType); return f; } }