public void MeasureTimeOfFinishedLoadingFromDB() { var dbCecheService = new DBCacheService(); var filePaths = Directory.GetFiles(@"D:\Pictures\VRChat", "*.png", SearchOption.AllDirectories); var stopwatch1 = new Stopwatch(); stopwatch1.Start(); var photos = dbCecheService.Photos .Select(p => new { p.FilePath, p.World, p.Photographer, p.Date, p.PhotoUsers }).ToList(); stopwatch1.Stop(); Debug.Print($"{photos.Count}, Time:{stopwatch1.ElapsedMilliseconds} ms"); return; var stopwatch2 = new Stopwatch(); stopwatch2.Start(); int count = 0; foreach (var filePath in filePaths) { var meta = dbCecheService.GetVrcMetaDataIfExists(filePath); if (meta is null) { //Debug.Print($"{filePath} is null"); count++; } } stopwatch2.Stop(); Debug.Print($"PhotoCount:{filePaths.Length-count}/{filePaths.Length}, Time:{stopwatch2.ElapsedMilliseconds} ms"); }
public async Task TestAsync() { /*if (File.Exists(_dbFilePath)) * { * File.Delete(_dbFilePath); * }*/ var dbCecheService = new DBCacheService(); Assert.IsTrue(File.Exists(_dbFilePath)); var filePaths = Directory.GetFiles(@"D:\Pictures\VRChat", "*.png", SearchOption.AllDirectories); await dbCecheService.CreateDBCacheIfNeededAsync(filePaths); var photos = await dbCecheService.GetAllPhotosAsync(); foreach (var photo in photos) { Console.WriteLine(photo.FilePath); } //Assert.IsTrue(photos.Count == 66); }
public MainViewModel(MainWindow mainWindow) { _mainWindow = mainWindow; _db = new DBCacheService($"{AppCache.Instance.CacheFolderPath}{Path.DirectorySeparatorChar}cache.db"); _vrcPhotographs = new VrcPhotographs(_db).AddTo(Disposable); _searchResult = new SearchResult(_vrcPhotographs.Collection).AddTo(Disposable); _users = new Users(_vrcPhotographs.Collection).AddTo(Disposable); SearchText = _searchResult.SearchText.ToReactivePropertyAsSynchronized(x => x.Value).AddTo(Disposable); ShowedPhotoList = _searchResult.ShowedPhotoList.ObserveAddChanged() .ToReadOnlyReactiveCollection( onReset: Observable.Merge( _searchResult.SearchText, _searchResult.ResearchCommand, _searchResult.ResetCommand) .Select(_ => Unit.Default)) .AddTo(Disposable); HaveNoShowedPhoto = ShowedPhotoList.ObserveAddChanged().Select(_ => !ShowedPhotoList.Any()).ToReactiveProperty().AddTo(Disposable); PhotoCount = Observable.Merge( ShowedPhotoList.ObserveAddChanged().Select(_ => Unit.Default), ShowedPhotoList.ObserveRemoveChanged().Select(_ => Unit.Default), ShowedPhotoList.ObserveResetChanged().Select(_ => Unit.Default) ).Select(_ => $"{ShowedPhotoList.Count} 枚").ToReactiveProperty().AddTo(Disposable); SearchDate = _searchResult.SearchedDate.ToReactivePropertyAsSynchronized(x => x.Value).AddTo(Disposable); SearchWithUserNameCommand = new ReactiveCommand <string>().AddTo(Disposable); SearchWithUserNameCommand.Subscribe(_searchResult.SearchWithUserName).AddTo(Disposable); SearchWithWorldNameCommand = new ReactiveCommand <string>().AddTo(Disposable); SearchWithWorldNameCommand.Subscribe(_searchResult.SearchWithWorldName).AddTo(Disposable); SearchWithDateCommand = new ReactiveCommand <string>().AddTo(Disposable); SearchWithDateCommand.Subscribe(dateString => _searchResult.SearchWithDate(DateTime.Parse(dateString, new CultureInfo("en-US")))).AddTo(Disposable); SearchWithDateTypeCommand = new ReactiveCommand <DateSearchType>().AddTo(Disposable); SearchWithDateTypeCommand.Subscribe(type => { var now = DateTime.Now; if (type == DateSearchType.TODAY) { SearchDate.Value = now; } else if (type == DateSearchType.WEEK) { _searchResult.SearchWithDatePeriodString(now.AddDays(-7).ToString("yyyy/MM/dd HH:mm:ss", new CultureInfo("en-US")), now.ToString("yyyy/MM/dd HH:mm:ss", new CultureInfo("en-US"))); } else if (type == DateSearchType.MONTH) { _searchResult.SearchWithDatePeriodString(now.AddMonths(-1).ToString("yyyy/MM/dd HH:mm:ss", new CultureInfo("en-US")), now.ToString("yyyy/MM/dd HH:mm:ss", new CultureInfo("en-US"))); } }); ClearSearchText = new ReactiveCommand().AddTo(Disposable); ClearSearchText.Subscribe(() => SearchText.Value = string.Empty).AddTo(Disposable); CurrentUserSortType = new ReactiveProperty <UserSortType>(UserSortType.None).AddTo(Disposable); CurrentUserSortType.Subscribe(type => _users.SortType.Value = CurrentUserSortType.Value).AddTo(Disposable); UserList = _users.SortedUserList.ObserveAddChanged() .Select(u => u.Name) .ToReadOnlyReactiveCollection( onReset: Observable.Merge(_users.SortCommand, _users.ResetCommand).Select(_ => Unit.Default)) .AddTo(Disposable); SortUserWithAlphabetCommand = new ReactiveCommand().AddTo(Disposable); SortUserWithCountCommand = new ReactiveCommand().AddTo(Disposable); SortUserWithAlphabetCommand.Subscribe(() => CurrentUserSortType.Value = UserSortType.Alphabet).AddTo(Disposable); SortUserWithCountCommand.Subscribe(() => CurrentUserSortType.Value = UserSortType.Count).AddTo(Disposable); CanUseToSorting = _users.SortedUserList.CollectionChangedAsObservable() .Select(_ => _users.SortedUserList.Any()).ToReactiveProperty(false).AddTo(Disposable); OpenPhotoPreviewCommand = new ReactiveCommand <Photo>().AddTo(Disposable); OpenPhotoPreviewCommand.Subscribe(photo => { if (!(photo is null)) { WindowHelper.OpenPhotoPreviewWindow(photo, ShowedPhotoList.ToList(), _searchResult, _mainWindow); } }).AddTo(Disposable); OpenSettingCommand = new ReactiveCommand().AddTo(Disposable); OpenSettingCommand.Subscribe(() => WindowHelper.OpenSettingDialog(_mainWindow)).AddTo(Disposable); LoadResourcesCommand = new ReactiveCommand().AddTo(Disposable); LoadResourcesCommand.Subscribe(() => { _loadingCancel = new CancellationTokenSource().AddTo(Disposable); var folderPaths = GetPhotoFolders(Setting.Instance.Data.PhotoFolders); _loadingTask = _vrcPhotographs.LoadVRCPhotoListAsync(folderPaths, _loadingCancel.Token); }).AddTo(Disposable); CancelLoadingCommand = new ReactiveCommand().AddTo(Disposable); CancelLoadingCommand.Subscribe(() => { if (!(_loadingCancel is null)) { try { _loadingCancel.Cancel(); } catch (TaskCanceledException e) { } } }); RebootCommand = new ReactiveCommand().AddTo(Disposable); RebootCommand.Subscribe(async() => { CancelLoadingCommand.Execute(); // キャンセルにラグがあるので少し待つ await Task.Delay(2000).ConfigureAwait(true); _searchResult.ResetCommand.Execute(); _users.ResetCommand.Execute(); LoadResourcesCommand.Execute(); }).AddTo(Disposable); DeleteCacheCommand = new ReactiveCommand().AddTo(Disposable); DeleteCacheCommand.Subscribe(async() => { CancelLoadingCommand.Execute(); await _db.DeleteAll().ConfigureAwait(true); AppCache.Instance.DeleteCacheFileAll(); }); ActiveProgressRing = new ReactiveProperty <bool>(true).AddTo(Disposable); _vrcPhotographs.Collection.ObserveAddChangedItems().Subscribe(_ => ActiveProgressRing.Value = false).AddTo(Disposable); _vrcPhotographs.Collection.ObserveResetChanged().Subscribe(_ => ActiveProgressRing.Value = true).AddTo(Disposable); }