/// <summary> /// Gets a user file system item info from the remote storage data. /// </summary> /// <param name="remoteStorageItem">Remote storage item info.</param> /// <returns>User file system item info.</returns> public static IFileSystemItemMetadata GetUserFileSysteItemMetadata(FileSystemInfo remoteStorageItem) { IFileSystemItemMetadata userFileSystemItem; if (remoteStorageItem is FileInfo) { userFileSystemItem = new FileMetadata(); ((FileMetadata)userFileSystemItem).Length = ((FileInfo)remoteStorageItem).Length; } else { userFileSystemItem = new FolderMetadata(); } // Store you item ID here. It will be passed to IEngine.GetFileSystemItemAsync() during every operation. // Note that the file is deleted during MS Office transactional save and iten ID will be deleted with it. // See Virtual Drive sample for MS Office documents editing. userFileSystemItem.ItemId = WindowsFileSystemItem.GetItemIdByPath(remoteStorageItem.FullName); userFileSystemItem.Name = remoteStorageItem.Name; userFileSystemItem.Attributes = remoteStorageItem.Attributes; userFileSystemItem.CreationTime = remoteStorageItem.CreationTime; userFileSystemItem.LastWriteTime = remoteStorageItem.LastWriteTime; userFileSystemItem.LastAccessTime = remoteStorageItem.LastAccessTime; userFileSystemItem.ChangeTime = remoteStorageItem.LastWriteTime; return(userFileSystemItem); }
/// <inheritdoc/> public async Task <byte[]> CreateFileAsync(IFileMetadata fileMetadata, Stream content = null) { Logger.LogMessage($"{nameof(IFolder)}.{nameof(CreateFileAsync)}()", Path.Combine(UserFileSystemPath, fileMetadata.Name)); FileInfo remoteStorageItem = new FileInfo(Path.Combine(RemoteStoragePath, fileMetadata.Name)); // Upload remote storage file content. await using (FileStream remoteStorageStream = remoteStorageItem.Open(FileMode.CreateNew, FileAccess.Write, FileShare.Delete)) { if (content != null) { await content.CopyToAsync(remoteStorageStream); remoteStorageStream.SetLength(content.Length); } } // Update remote storage file metadata. remoteStorageItem.Attributes = fileMetadata.Attributes; remoteStorageItem.CreationTimeUtc = fileMetadata.CreationTime.UtcDateTime; remoteStorageItem.LastWriteTimeUtc = fileMetadata.LastWriteTime.UtcDateTime; remoteStorageItem.LastAccessTimeUtc = fileMetadata.LastAccessTime.UtcDateTime; remoteStorageItem.LastWriteTimeUtc = fileMetadata.LastWriteTime.UtcDateTime; // Return remote storage item ID. It will be passed later into IEngine.GetFileSystemItemAsync() method. return(WindowsFileSystemItem.GetItemIdByPath(remoteStorageItem.FullName)); }
/// <inheritdoc/> public async Task <byte[]> CreateFolderAsync(IFolderMetadata folderMetadata) { Logger.LogMessage($"{nameof(IFolder)}.{nameof(CreateFolderAsync)}()", Path.Combine(UserFileSystemPath, folderMetadata.Name)); DirectoryInfo remoteStorageItem = new DirectoryInfo(Path.Combine(RemoteStoragePath, folderMetadata.Name)); remoteStorageItem.Create(); // Update remote storage folder metadata. remoteStorageItem.Attributes = folderMetadata.Attributes; remoteStorageItem.CreationTimeUtc = folderMetadata.CreationTime.UtcDateTime; remoteStorageItem.LastWriteTimeUtc = folderMetadata.LastWriteTime.UtcDateTime; remoteStorageItem.LastAccessTimeUtc = folderMetadata.LastAccessTime.UtcDateTime; remoteStorageItem.LastWriteTimeUtc = folderMetadata.LastWriteTime.UtcDateTime; // Return remote storage item ID. It will be passed later into IEngine.GetFileSystemItemAsync() method. return(WindowsFileSystemItem.GetItemIdByPath(remoteStorageItem.FullName)); }
static async Task Main(string[] args) { // Load Settings. IConfiguration configuration = new ConfigurationBuilder().AddJsonFile("appsettings.json", false, true).Build(); Settings = configuration.ReadSettings(); // Load Log4Net for net configuration. var logRepository = LogManager.GetRepository(Assembly.GetEntryAssembly()); XmlConfigurator.Configure(logRepository, new FileInfo(Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "log4net.config"))); // Enable UTF8 for Console Window Console.OutputEncoding = System.Text.Encoding.UTF8; log.Info($"\n{System.Diagnostics.Process.GetCurrentProcess().ProcessName} {Settings.AppID}"); log.Info("\nPress 'Q' to unregister file system, delete all files/folders and exit (simulate uninstall with full cleanup)."); log.Info("\nPress 'q' to unregister file system and exit (simulate uninstall)."); log.Info("\nPress any other key to exit without unregistering (simulate reboot)."); log.Info("\n----------------------\n"); // Typically you will register sync root during your application installation. // Here we register it during first program start for the sake of the development convenience. if (!await Registrar.IsRegisteredAsync(Settings.UserFileSystemRootPath)) { log.Info($"\nRegistering {Settings.UserFileSystemRootPath} sync root."); Directory.CreateDirectory(Settings.UserFileSystemRootPath); await Registrar.RegisterAsync(SyncRootId, Settings.UserFileSystemRootPath, Settings.ProductName, Path.Combine(Settings.IconsFolderPath, "Drive.ico")); // Set root item ID. It will be passed to IEngine.GetFileSystemItemAsync() method // as itemId parameter when a root folder is requested. byte[] itemId = WindowsFileSystemItem.GetItemIdByPath(Settings.RemoteStorageRootPath); PlaceholderFolder.GetItem(Settings.UserFileSystemRootPath).SetItemId(itemId); } else { log.Info($"\n{Settings.UserFileSystemRootPath} sync root already registered."); } // Log indexed state. StorageFolder userFileSystemRootFolder = await StorageFolder.GetFolderFromPathAsync(Settings.UserFileSystemRootPath); log.Info($"\nIndexed state: {(await userFileSystemRootFolder.GetIndexedStateAsync())}\n"); ConsoleKeyInfo exitKey; try { Engine = new VirtualEngine(Settings.UserFileSystemLicense, Settings.UserFileSystemRootPath, Settings.RemoteStorageRootPath, log); // Start processing OS file system calls. await Engine.StartAsync(); #if DEBUG // Opens Windows File Manager with user file system folder and remote storage folder. ShowTestEnvironment(); #endif // Keep this application running until user input. exitKey = Console.ReadKey(); } finally { Engine.Dispose(); } if (exitKey.KeyChar == 'q') { // Unregister during programm uninstall. await Registrar.UnregisterAsync(SyncRootId); log.Info($"\n\nUnregistering {Settings.UserFileSystemRootPath} sync root."); log.Info("\nAll empty file and folder placeholders are deleted. Hydrated placeholders are converted to regular files / folders.\n"); } else if (exitKey.KeyChar == 'Q') { log.Info($"\n\nUnregistering {Settings.UserFileSystemRootPath} sync root."); log.Info("\nAll files and folders placeholders are deleted.\n"); // Unregister during programm uninstall and delete all files/folder. await Registrar.UnregisterAsync(SyncRootId); try { Directory.Delete(Settings.UserFileSystemRootPath, true); } catch (Exception ex) { log.Error($"\n{ex}"); } } else { log.Info("\n\nAll downloaded file / folder placeholders remain in file system. Restart the application to continue managing files.\n"); } }