/// <summary> /// Called when a file or folder is created in the remote storage. /// </summary> /// <remarks>In this method we create a new file/folder in the user file system.</remarks> private async void CreatedAsync(object sender, FileSystemEventArgs e) { LogMessage(e.ChangeType.ToString(), e.FullPath); string remoteStoragePath = e.FullPath; try { string userFileSystemPath = Mapping.ReverseMapPath(remoteStoragePath); // This check is only required because we can not prevent circular calls because of the simplicity of this example. // In your real-life application you will not sent updates from server back to client that issued the update. if (!FsPath.Exists(userFileSystemPath)) { string userFileSystemParentPath = Path.GetDirectoryName(userFileSystemPath); // Because of the on-demand population the file or folder placeholder may not exist in the user file system // or the folder may be offline. FileSystemInfo remoteStorageItem = FsPath.GetFileSystemItem(remoteStoragePath); if (remoteStorageItem != null) { IFileSystemItemMetadata newItemInfo = Mapping.GetUserFileSysteItemMetadata(remoteStorageItem); if (await engine.ServerNotifications(userFileSystemParentPath).CreateAsync(new[] { newItemInfo }) > 0) { LogMessage($"Created succesefully", userFileSystemPath); engine.CustomDataManager(userFileSystemPath, this).IsNew = false; } } } } catch (Exception ex) { LogError($"{e.ChangeType} failed", remoteStoragePath, null, ex); } }
///<inheritdoc> public async Task MoveToAsync(string userFileSystemNewPath, byte[] targetParentItemId, IOperationContext operationContext, IConfirmationResultContext resultContext) { string userFileSystemOldPath = this.UserFileSystemPath; Logger.LogMessage($"{nameof(IFileSystemItem)}.{nameof(MoveToAsync)}()", userFileSystemOldPath, userFileSystemNewPath); string remoteStorageOldPath = RemoteStoragePath; string remoteStorageNewPath = Mapping.MapPath(userFileSystemNewPath); FileSystemInfo remoteStorageOldItem = FsPath.GetFileSystemItem(remoteStorageOldPath); if (remoteStorageOldItem != null) { if (remoteStorageOldItem is FileInfo) { (remoteStorageOldItem as FileInfo).MoveTo(remoteStorageNewPath, true); } else { (remoteStorageOldItem as DirectoryInfo).MoveTo(remoteStorageNewPath); } Logger.LogMessage("Moved item in remote storage succesefully", userFileSystemOldPath, userFileSystemNewPath); } await Engine.CustomDataManager(userFileSystemOldPath, Logger).MoveToAsync(userFileSystemNewPath); }
/// <summary> /// Called when a file or folder is renamed in the user file system. /// </summary> private async void RenamedAsync(object sender, RenamedEventArgs e) { // If the item was previously filtered by EngineWindows.FilterAsync(), // for example temp MS Office file was renamed SGE4274H -> file.xlsx, // we need to convert the file to a pleaceholder and upload it to the remote storage. LogMessage("Renamed", e.OldFullPath, e.FullPath); string userFileSystemOldPath = e.OldFullPath; string userFileSystemNewPath = e.FullPath; try { if (System.IO.File.Exists(userFileSystemNewPath) && !MsOfficeHelper.AvoidMsOfficeSync(userFileSystemNewPath)) { if (!PlaceholderItem.IsPlaceholder(userFileSystemNewPath)) { if (engine.CustomDataManager(userFileSystemNewPath).IsNew) { await engine.ClientNotifications(userFileSystemNewPath, this).CreateAsync(); } else { LogMessage("Converting to placeholder", userFileSystemNewPath); PlaceholderItem.ConvertToPlaceholder(userFileSystemNewPath, null, null, false); await engine.ClientNotifications(userFileSystemNewPath, this).UpdateAsync(); await engine.CustomDataManager(userFileSystemNewPath).RefreshCustomColumnsAsync(); } } } } catch (Exception ex) { LogError($"{e.ChangeType} failed", userFileSystemOldPath, userFileSystemNewPath, ex); } }