public async Task LoadSolutionAsync() { if (RootFolder is null || sdkManager.ActiveSdk is null) { return; } if (TemporarySolutionFolder is null) { var files = await RootFolder.GetFilesAsync(); if (files.FirstOrDefault(s => s.FileType == ".sln" || s.FileType.Contains("proj")) is StorageFile originalSolutionFile) { StorageFolder solutionsFolder = await GetTemporarySolutionsFolderAsync(); TemporarySolutionFolder = await RootFolder.CopyAsync(solutionsFolder, NameCollisionOption.ReplaceExisting, "bin", "obj"); } } using (await solutionLoadLock.LockAsync()) { Workspace.CloseSolution(); if (TemporarySolutionFolder != null) { var files = await TemporarySolutionFolder.GetFilesAsync(); if (files.FirstOrDefault(s => s.FileType == ".sln") is StorageFile solutionFile) { await Task.Run(() => Workspace.OpenSolutionAsync(solutionFile.Path)); } else if (files.FirstOrDefault(s => s.FileType.Contains("proj")) is StorageFile projectFile) { await Task.Run(() => Workspace.OpenProjectAsync(projectFile.Path)); } } } }
private async Task ApplyChangesToTemporaryFolderAsync(IReadOnlyList <StorageLibraryChange> changes) { if (RootFolder is null || TemporarySolutionFolder is null) { return; } foreach (StorageLibraryChange change in changes) { if (Path.GetFileName(change.Path).StartsWith(".") || Path.GetFileName(change.PreviousPath).StartsWith(".")) { continue; } switch (change.ChangeType) { case StorageLibraryChangeType.Created: case StorageLibraryChangeType.ContentsChanged: case StorageLibraryChangeType.MovedIntoLibrary: case StorageLibraryChangeType.ContentsReplaced: { string relativePath = StorageExtensions.GetRelativePath(RootFolder.Path, change.Path); string relativeDirectory = Path.GetDirectoryName(relativePath); IStorageItem?destinationItem = relativePath.Contains(Path.DirectorySeparatorChar) ? await TemporarySolutionFolder.TryGetItemAsync(relativeDirectory) : TemporarySolutionFolder; IStorageItem?item = await change.GetStorageItemAsync(); if (destinationItem is IStorageFolder destinationFolder) { if (item is IStorageFile file) { await file.CopyAsync(destinationFolder, file.Name, NameCollisionOption.ReplaceExisting); } else if (item is IStorageFolder folder) { await folder.CopyAsync(destinationFolder, NameCollisionOption.ReplaceExisting); } } } break; case StorageLibraryChangeType.Deleted: case StorageLibraryChangeType.MovedOutOfLibrary: { string relativePath = StorageExtensions.GetRelativePath(RootFolder.Path, change.Path); IStorageItem?item = await TemporarySolutionFolder.TryGetItemAsync(relativePath); if (item != null) { await item.DeleteAsync(); } } break; case StorageLibraryChangeType.MovedOrRenamed: { string relativePath = StorageExtensions.GetRelativePath(RootFolder.Path, change.Path); string relativeDirectory = Path.GetDirectoryName(relativePath); string previousRelativePath = StorageExtensions.GetRelativePath(RootFolder.Path, change.PreviousPath); IStorageItem?destinationItem = relativePath.Contains(Path.DirectorySeparatorChar) ? await TemporarySolutionFolder.TryGetItemAsync(relativeDirectory) : TemporarySolutionFolder; IStorageItem?item = await TemporarySolutionFolder.GetItemAsync(previousRelativePath); if (item != null) { if (Path.GetDirectoryName(change.Path).Equals(Path.GetDirectoryName(change.PreviousPath), StringComparison.OrdinalIgnoreCase)) { await item.RenameAsync(Path.GetFileName(change.Path)); } else { if (destinationItem is IStorageFolder destinationFolder) { if (item is IStorageFile file) { await file.MoveAsync(destinationFolder, file.Name, NameCollisionOption.ReplaceExisting); } else if (item is IStorageFolder folder) { await folder.MoveAsync(destinationFolder, NameCollisionOption.ReplaceExisting); } } } } } break; } } }