using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Diagnostics; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Media.Imaging; using System.Windows.Shapes; using Ink_Canvas.Helpers; using JetBrains.Annotations; namespace Ink_Canvas { public partial class MainWindow : PerformanceTransparentWin { public class StorageLocationItem { public string Path { get; set; } public ImageSource Icon { get; set; } public string Title { get; set; } public bool IsDrive { get; set; } public DriveType DriveType { get; set; } public string SelectItem { get; set; } } public static long GetDirectorySize(System.IO.DirectoryInfo directoryInfo, bool recursive = true) { var startDirectorySize = default(long); if (directoryInfo == null || !directoryInfo.Exists) return startDirectorySize; //Return 0 while Directory does not exist. //Add size of files in the Current Directory to main size. foreach (var fileInfo in directoryInfo.GetFiles()) System.Threading.Interlocked.Add(ref startDirectorySize, fileInfo.Length); if (recursive) //Loop on Sub Direcotries in the Current Directory and Calculate it's files size. System.Threading.Tasks.Parallel.ForEach(directoryInfo.GetDirectories(), (subDirectory) => System.Threading.Interlocked.Add(ref startDirectorySize, GetDirectorySize(subDirectory, recursive))); return startDirectorySize; } public async Task GetDirectorySizeAsync(System.IO.DirectoryInfo directoryInfo, bool recursive = true) { var size = await Task.Run(()=> GetDirectorySize(directoryInfo, recursive)); return size; } private static string FormatBytes(long bytes) { string[] Suffix = { "B", "KB", "MB", "GB", "TB" }; int i; double dblSByte = bytes; for (i = 0; i < Suffix.Length && bytes >= 1024; i++, bytes /= 1024) { dblSByte = bytes / 1024.0; } return String.Format("{0:0.##} {1}", dblSByte, Suffix[i]); } private ObservableCollection storageLocationItems = new ObservableCollection() { }; private void UpdateStorageLocations() { DriveInfo[] allDrives = DriveInfo.GetDrives(); var fixedDrives = new List() { }; var integratedFolders = new List() { }; storageLocationItems.Clear(); foreach (var driveInfo in allDrives) { if (driveInfo.DriveType == DriveType.Fixed) { if (driveInfo.Name.Contains("C") || !driveInfo.IsReady) continue; fixedDrives.Add(new StorageLocationItem() { Path = driveInfo.Name + "InkCanvasForClass", Title = driveInfo.Name.Substring(0,1) + "盘 ", Icon = new BitmapImage(new Uri("pack://application:,,,/Resources/Icons-png/classic-icons/disk-drive.png")), DriveType = driveInfo.DriveType, IsDrive = true, SelectItem = "d"+driveInfo.Name.Substring(0,1).ToLower() }); } } var docfolder = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); integratedFolders.Add(new StorageLocationItem() { Path = (docfolder.EndsWith("\\") ? docfolder.Substring(0, docfolder.Length - 1) : docfolder) + "\\InkCanvasForClass", Title = "“文档”文件夹 ", IsDrive = false, Icon = new BitmapImage(new Uri("pack://application:,,,/Resources/Icons-png/classic-icons/documents-folder.png")), SelectItem = "fw" }); var runfolder = AppDomain.CurrentDomain.BaseDirectory; integratedFolders.Add(new StorageLocationItem() { Path = (runfolder.EndsWith("\\") ? runfolder.Substring(0, runfolder.Length - 1) : runfolder) + "\\InkCanvasForClass", Title = "icc安装目录 ", IsDrive = false, Icon = new BitmapImage(new Uri("pack://application:,,,/Resources/Icons-png/classic-icons/folder.png")), SelectItem = "fr" }); var usrfolder = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile); integratedFolders.Add(new StorageLocationItem() { Path = (usrfolder.EndsWith("\\") ? usrfolder.Substring(0, usrfolder.Length - 1) : usrfolder) + "\\InkCanvasForClass", Title = "当前用户目录 ", IsDrive = false, Icon = new BitmapImage(new Uri("pack://application:,,,/Resources/Icons-png/classic-icons/user-folder.png")), SelectItem = "fu" }); var dskfolder = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory); integratedFolders.Add(new StorageLocationItem() { Path = (dskfolder.EndsWith("\\") ? dskfolder.Substring(0, dskfolder.Length - 1) : dskfolder) + "\\InkCanvasForClass", Title = "“桌面”文件夹 ", IsDrive = false, Icon = new BitmapImage(new Uri("pack://application:,,,/Resources/Icons-png/classic-icons/desktop-folder.png")), SelectItem = "fd" }); foreach (var i in fixedDrives) storageLocationItems.Add(i); foreach (var i in integratedFolders) storageLocationItems.Add(i); storageLocationItems.Add(new StorageLocationItem() { Path = "", Title = "自定义... ", IsDrive = false, Icon = new BitmapImage(new Uri("pack://application:,,,/Resources/Icons-png/classic-icons/folder.png")), SelectItem = "c-" }); } private bool isChangingUserStorageSelectionProgramically = false; private void UpdateUserStorageSelection() { // 先获取磁盘信息 DriveInfo[] allDrives = DriveInfo.GetDrives(); var fixedDrives = new List() { }; foreach (var driveInfo in allDrives) { if (driveInfo.Name.Contains("C") || !driveInfo.IsReady) continue; fixedDrives.Add("d"+driveInfo.Name.Substring(0,1).ToLower()); } var integratedFolders = new List() { "fw", "fr", "fu", "fd" // fw - folder wendang ; fd - folder desktop ; fu - folder user ; fr - folder running }; if (Settings.Storage.StorageLocation.Substring(0, 1) == "d") { if (fixedDrives.Count == 0) { Settings.Storage.StorageLocation = "fw"; SaveSettingsToFile(); ComboBoxStoragePath.SelectedIndex = 0; } else if (fixedDrives.Contains(Settings.Storage.StorageLocation)) { ComboBoxStoragePath.SelectedIndex = fixedDrives.IndexOf(Settings.Storage.StorageLocation); } else { ComboBoxStoragePath.SelectedIndex = 0; Settings.Storage.StorageLocation = fixedDrives[0]; SaveSettingsToFile(); } } else if (Settings.Storage.StorageLocation.Substring(0, 1) == "f") { if (integratedFolders.Contains(Settings.Storage.StorageLocation)) { ComboBoxStoragePath.SelectedIndex = fixedDrives.Count + integratedFolders.IndexOf(Settings.Storage.StorageLocation); } else { ComboBoxStoragePath.SelectedIndex = fixedDrives.Count; Settings.Storage.StorageLocation = "fw"; SaveSettingsToFile(); } } else if (Settings.Storage.StorageLocation.Substring(0, 1) == "c") { ComboBoxStoragePath.SelectedIndex = storageLocationItems.Count - 1; } if (isLoaded) CustomStorageLocationGroup.Visibility = Settings.Storage.StorageLocation == "c-" ? Visibility.Visible : Visibility.Collapsed; if (isLoaded) CustomStorageLocation.Text = Settings.Storage.UserStorageLocation; } private void ComboBoxStoragePath_DropDownOpened(object sender, EventArgs e) { isChangingUserStorageSelectionProgramically = true; UpdateStorageLocations(); UpdateUserStorageSelection(); isChangingUserStorageSelectionProgramically = false; } private async Task GetDirectoryFilesCount(string path) { var count = await Task.Run(() => Directory.GetFiles(path, "*", SearchOption.AllDirectories).Length); return count; } private void InitStorageFoldersStructure(string dirPath) { string path; if (storageLocationItems[ComboBoxStoragePath.SelectedIndex].SelectItem == "c-") { if (Settings.Storage.StorageLocation != "c-") { var si = Settings.Storage.StorageLocation; var item = storageLocationItems.Where(i => i.SelectItem == si).ToArray()[0]; path = item.Path; } else { if (Settings.Storage.UserStorageLocation != "") { path = new DirectoryInfo(Settings.Storage.UserStorageLocation).FullName; } else { var item = storageLocationItems.Where(i => i.SelectItem == "fr").ToArray()[0]; path = item.Path; Settings.Storage.StorageLocation = "fr"; SaveSettingsToFile(); UpdateStorageLocations(); UpdateUserStorageSelection(); } } } else { if (dirPath == null) { var si = Settings.Storage.StorageLocation; var item = storageLocationItems.Where(i => i.SelectItem == si).ToArray()[0]; path = item.Path; } else path = dirPath; } var basePath = new DirectoryInfo(path); var autoSavedInkPath = new DirectoryInfo(path+"\\AutoSavedInk"); var autoSavedSnapshotPath = new DirectoryInfo(path+"\\AutoSavedSnapshot"); var exportedInkPath = new DirectoryInfo(path+"\\ExportedInk"); var quotedPhotosPath = new DirectoryInfo(path+"\\QuotedPhotos"); var cachesPath = new DirectoryInfo(path+"\\caches"); var paths = new DirectoryInfo[] { basePath, autoSavedInkPath, autoSavedSnapshotPath, exportedInkPath, quotedPhotosPath, cachesPath }; foreach (var di in paths) { if (!di.Exists) di.Create(); } } private bool isAnalyzingStorageInfo = false; private async void StartAnalyzeStorage(bool forceAnalyze = false) { if (isAnalyzingStorageInfo && !forceAnalyze) return; isAnalyzingStorageInfo = true; var item = storageLocationItems[ComboBoxStoragePath.SelectedIndex]; StorageAnalazeWaitingGroup.Visibility = Visibility.Visible; StorageAnalazeGroup.Visibility = Visibility.Collapsed; string path; var runfolder = AppDomain.CurrentDomain.BaseDirectory; if (item.SelectItem != "c-") { path = item.Path; } else if (Settings.Storage.UserStorageLocation != "") { path = Settings.Storage.UserStorageLocation; } else { path = (runfolder.EndsWith("\\") ? runfolder.Substring(0, runfolder.Length - 1) : runfolder) + "\\InkCanvasForClass"; } StorageNowLocationTextBlock.Text = $"当前位置:{path}"; DriveInfo[] allDrives = DriveInfo.GetDrives(); var driveArr = allDrives.Where((info, i) => info.Name.Substring(0,1)==path.Substring(0,1)).ToArray(); if (driveArr.Length > 0) { StorageDiskUsageTextBlock.Visibility = Visibility.Visible; var freeSpace = driveArr[0].TotalFreeSpace; var usedSpace = driveArr[0].TotalSize - driveArr[0].TotalFreeSpace; StorageDiskUsageTextBlock.Text = $"磁盘使用情况:已用 {FormatBytes(usedSpace)}、剩余 {FormatBytes(freeSpace)}"; var dirsize = await GetDirectorySizeAsync(new DirectoryInfo(path)); var formatedDirSize = FormatBytes(dirsize); var dirFilecount = await GetDirectoryFilesCount(path); StorageDirectoryUsageTextBlock.Text = $"目录占用情况:已用 {formatedDirSize},共 {dirFilecount} 个文件"; var usedBorderWidth = Math.Round(388 * ((double)usedSpace / (double)(driveArr[0].TotalSize)), 1); var ICCUsedBorderWidth = Math.Round(usedBorderWidth * ((double)dirsize / (double)usedSpace), 1); usedBorderWidth = usedBorderWidth - ICCUsedBorderWidth; ICCDirectoryStorageAnalyzeGroup.Visibility = dirsize == 0 ? Visibility.Collapsed : Visibility.Visible; DiskUsageUsedSpaceBorder.Width = usedBorderWidth; DiskUsageICCSpaceBorder.Width = ICCUsedBorderWidth; var asiSize = await GetDirectorySizeAsync(new DirectoryInfo(path + "\\AutoSavedInk")); var assSize = await GetDirectorySizeAsync(new DirectoryInfo(path + "\\AutoSavedSnapshot")); var eiSize = await GetDirectorySizeAsync(new DirectoryInfo(path + "\\ExportedInk")); var qpSize = await GetDirectorySizeAsync(new DirectoryInfo(path + "\\QuotedPhotos")); var cachesSize = await GetDirectorySizeAsync(new DirectoryInfo(path + "\\caches")); ClearCacheFilesButton.IsEnabled = cachesSize != 0; ClearAutoSavedSnapshotButton.IsEnabled = assSize != 0; StorageDirectoryAutoSavedInkUsageBorder.Width = Math.Round(388 * ((double)asiSize / (double)dirsize), 1); StorageDirectoryAutoSavedSnapshotUsageBorder.Width = Math.Round(388 * ((double)assSize / (double)dirsize), 1); StorageDirectoryExportedInkUsageBorder.Width = Math.Round(388 * ((double)eiSize / (double)dirsize), 1); StorageDirectoryQuotedPhotoUsageBorder.Width = Math.Round(388 * ((double)qpSize / (double)dirsize), 1); StorageDirectoryCachesUsageBorder.Width = Math.Round(388 * ((double)cachesSize / (double)dirsize), 1); StorageAutoSavedInkDescription.Text = $"{Math.Round(100 * ((double)asiSize / (double)dirsize), 1)}% 、{FormatBytes(asiSize)}"; StorageAutoSavedSnapshotDescription.Text = $"{Math.Round(100 * ((double)assSize / (double)dirsize), 1)}% 、{FormatBytes(assSize)}"; StorageExportedInkDescription.Text = $"{Math.Round(100 * ((double)eiSize / (double)dirsize), 1)}% 、{FormatBytes(eiSize)}"; StorageQuotedPhotosDescription.Text = $"{Math.Round(100 * ((double)qpSize / (double)dirsize), 1)}% 、{FormatBytes(qpSize)}"; StorageCachesDescription.Text = $"{Math.Round(100 * ((double)cachesSize / (double)dirsize), 1)}% 、{FormatBytes(cachesSize)}"; StorageAnalazeWaitingGroup.Visibility = Visibility.Collapsed; StorageAnalazeGroup.Visibility = Visibility.Visible; isAnalyzingStorageInfo = false; } else isAnalyzingStorageInfo = false; } private void ClearCacheFilesButton_Clicked(object sender, RoutedEventArgs e) { var di = new DirectoryInfo(storageLocationItems[ComboBoxStoragePath.SelectedIndex].Path+"\\caches"); try { Directory.Delete(di.FullName, true); ShowNewToast("清理缓存成功!", MW_Toast.ToastType.Success, 2000); } catch (Exception ex) { ShowNewToast($"清理缓存失败!{ex.Message}", MW_Toast.ToastType.Error, 2000); } InitStorageFoldersStructure(storageLocationItems[ComboBoxStoragePath.SelectedIndex].Path); StartAnalyzeStorage(); } private void ClearAutoSavedSnapshotButton_Clicked(object sender, RoutedEventArgs e) { var di = new DirectoryInfo(storageLocationItems[ComboBoxStoragePath.SelectedIndex].Path+"\\AutoSavedSnapshot"); try { Directory.Delete(di.FullName, true); ShowNewToast("清理自动保存的截图成功!", MW_Toast.ToastType.Success, 2000); } catch (Exception ex) { ShowNewToast($"清理自动保存的截图失败!{ex.Message}", MW_Toast.ToastType.Error, 2000); } InitStorageFoldersStructure(storageLocationItems[ComboBoxStoragePath.SelectedIndex].Path); StartAnalyzeStorage(); } private DirectoryInfo GetDirectory(string type) { var path = ""; if (Settings.Storage.StorageLocation == "c-" && Settings.Storage.UserStorageLocation != "") path = Settings.Storage.UserStorageLocation; else path = storageLocationItems[ComboBoxStoragePath.SelectedIndex].Path; var autoSavedInkPath = new DirectoryInfo(path+"\\AutoSavedInk"); var autoSavedSnapshotPath = new DirectoryInfo(path+"\\AutoSavedSnapshot"); var exportedInkPath = new DirectoryInfo(path +"\\ExportedInk"); var quotedPhotosPath = new DirectoryInfo(path +"\\QuotedPhotos"); var cachesPath = new DirectoryInfo(path +"\\caches"); if (type == "autosaveink") return autoSavedInkPath; if (type == "autosavesnapshot") return autoSavedSnapshotPath; if (type == "exportedink") return exportedInkPath; if (type == "quotedphotos") return quotedPhotosPath; if (type == "caches") return cachesPath; return new DirectoryInfo(""); } private DirectoryInfo GetDirectoryInfoByIndex(int index) { var path = ""; if (Settings.Storage.StorageLocation == "c-" && Settings.Storage.UserStorageLocation != "") path = Settings.Storage.UserStorageLocation; else path = storageLocationItems[ComboBoxStoragePath.SelectedIndex].Path; var autoSavedInkPath = new DirectoryInfo(path +"\\AutoSavedInk"); var autoSavedSnapshotPath = new DirectoryInfo(path +"\\AutoSavedSnapshot"); var exportedInkPath = new DirectoryInfo(path +"\\ExportedInk"); var quotedPhotosPath = new DirectoryInfo(path +"\\QuotedPhotos"); var cachesPath = new DirectoryInfo(path +"\\caches"); return (new DirectoryInfo[] { autoSavedInkPath, quotedPhotosPath, exportedInkPath, cachesPath, autoSavedSnapshotPath })[index]; } private Border lastStorageJumpToFolderBorderDown = null; private void StorageJumpToFolderBtn_MouseDown(object sender, MouseButtonEventArgs e) { if (lastStorageJumpToFolderBorderDown != null) return; lastStorageJumpToFolderBorderDown = (Border)sender; lastStorageJumpToFolderBorderDown.Background = new SolidColorBrush(Color.FromRgb(39, 39, 42)); } private void StorageJumpToFolderBtn_MouseUp(object sender, MouseButtonEventArgs e) { if (lastStorageJumpToFolderBorderDown == null || lastStorageJumpToFolderBorderDown != (Border)sender) return; var bd = (Border)sender; StorageJumpToFolderBtn_MouseLeave(sender,null); var di = GetDirectoryInfoByIndex(Int32.Parse(bd.Name[bd.Name.Length - 1].ToString())); Process.Start("explorer.exe", di.FullName); } private void StorageJumpToFolderBtn_MouseLeave(object sender, MouseEventArgs e) { if (lastStorageJumpToFolderBorderDown == null || lastStorageJumpToFolderBorderDown != (Border)sender) return; lastStorageJumpToFolderBorderDown.Background = new SolidColorBrush(Colors.Transparent); lastStorageJumpToFolderBorderDown = null; } private void InitStorageManagementModule() { ComboBoxStoragePath.ItemsSource = storageLocationItems; ComboBoxStoragePath.DropDownOpened += ComboBoxStoragePath_DropDownOpened; ComboBoxStoragePath.SelectionChanged += ComboBoxStoragePath_OnSelectionChanged; isChangingUserStorageSelectionProgramically = true; UpdateStorageLocations(); UpdateUserStorageSelection(); isChangingUserStorageSelectionProgramically = false; HandleUserCustomStorageLocation(); InitStorageFoldersStructure(storageLocationItems[ComboBoxStoragePath.SelectedIndex].Path); StartAnalyzeStorage(); var sb = new Border[] { StorageJumpToFolderBtn1, StorageJumpToFolderBtn2, StorageJumpToFolderBtn3, StorageJumpToFolderBtn4, StorageJumpToFolderBtn5, }; foreach (var btn in sb) { btn.MouseUp += StorageJumpToFolderBtn_MouseUp; btn.MouseDown += StorageJumpToFolderBtn_MouseDown; btn.MouseLeave += StorageJumpToFolderBtn_MouseLeave; } CustomStorageLocationGroup.Visibility = ((StorageLocationItem)ComboBoxStoragePath.SelectedItem).SelectItem == "c-" ? Visibility.Visible : Visibility.Collapsed; CustomStorageLocationCheckPanel.Visibility = ((StorageLocationItem)ComboBoxStoragePath.SelectedItem).SelectItem == "c-" ? Visibility.Visible : Visibility.Collapsed; CustomStorageLocation.Text = Settings.Storage.UserStorageLocation; } private async void HandleUserCustomStorageLocation([CanBeNull] string dirPath = null) { var path = dirPath ?? (Settings.Storage.UserStorageLocation != "" ? Settings.Storage.UserStorageLocation : null); if (path != null) { CustomStorageLocationGroup.Visibility = Visibility.Visible; CustomStorageLocationCheckPanel.Visibility = Visibility.Visible; CustomStorageNonRemovableDriveTip.Visibility = Visibility.Visible; CustomStorageWritableTip.Visibility = Visibility.Collapsed; CustomStorageLocation.Text = ""; CustomStorageLocation.Text = new DirectoryInfo(path).FullName; // 加载动画 ((Image)CustomStorageNonRemovableDriveTip.Children[0]).Source = CustomStorageLocationCheckPanel.FindResource("LoadingIcon") as DrawingImage; ((Image)CustomStorageNonRemovableDriveTip.Children[0]).RenderTransformOrigin = new Point(0.5, 0.5); ((Image)CustomStorageNonRemovableDriveTip.Children[0]).RenderTransform = new RotateTransform(0, 8, 8); var tg = new EventTrigger(LoadedEvent); var sb = new Storyboard(); var da = new DoubleAnimation { To = -360, Duration = new Duration(new TimeSpan(0, 0, 1)), RepeatBehavior = RepeatBehavior.Forever, }; sb.Children.Add(da); Storyboard.SetTargetProperty(da, new PropertyPath("(Image.RenderTransform).(RotateTransform.Angle)")); tg.Actions.Add(new BeginStoryboard() { Storyboard = sb }); ((Image)CustomStorageNonRemovableDriveTip.Children[0]).Triggers.Add(tg); // 检测是否在非可移动存储上 var drive = new DirectoryInfo(path).FullName.Substring(0, 1); var allDrives = DriveInfo.GetDrives(); var ds = allDrives.Where(info => info.Name.StartsWith(drive) && info.DriveType == DriveType.Fixed); if (ds.Any()) { ((Image)CustomStorageNonRemovableDriveTip.Children[0]).Source = CustomStorageLocationCheckPanel.FindResource("SuccessIcon") as DrawingImage; ((TextBlock)CustomStorageNonRemovableDriveTip.Children[1]).Text = "非可移动存储介质"; } else { ((Image)CustomStorageNonRemovableDriveTip.Children[0]).Source = CustomStorageLocationCheckPanel.FindResource("FailedIcon") as DrawingImage; ((TextBlock)CustomStorageNonRemovableDriveTip.Children[1]).Text = "路径在可移动存储介质上"; } sb.Stop(); ((Image)CustomStorageNonRemovableDriveTip.Children[0]).Triggers.Remove(tg); // 加载动画2 CustomStorageWritableTip.Visibility = Visibility.Visible; ((Image)CustomStorageWritableTip.Children[0]).Source = CustomStorageLocationCheckPanel.FindResource("LoadingIcon") as DrawingImage; ((Image)CustomStorageWritableTip.Children[0]).RenderTransformOrigin = new Point(0.5, 0.5); ((Image)CustomStorageWritableTip.Children[0]).RenderTransform = new RotateTransform(0, 8, 8); var tg2 = new EventTrigger(LoadedEvent); var sb2 = new Storyboard(); var da2 = new DoubleAnimation { To = -360, Duration = new Duration(new TimeSpan(0, 0, 1)), RepeatBehavior = RepeatBehavior.Forever, }; sb.Children.Add(da2); Storyboard.SetTargetProperty(da2, new PropertyPath("(Image.RenderTransform).(RotateTransform.Angle)")); tg.Actions.Add(new BeginStoryboard() { Storyboard = sb2 }); ((Image)CustomStorageWritableTip.Children[0]).Triggers.Add(tg2); // 检查是否可写 var result = await DirectoryUtils.IsWritableAsync(path); if (result) { ((Image)CustomStorageWritableTip.Children[0]).Source = CustomStorageLocationCheckPanel.FindResource("SuccessIcon") as DrawingImage; ((TextBlock)CustomStorageWritableTip.Children[1]).Text = "目录可写"; } else { ((Image)CustomStorageWritableTip.Children[0]).Source = CustomStorageLocationCheckPanel.FindResource("FailedIcon") as DrawingImage; ((TextBlock)CustomStorageWritableTip.Children[1]).Text = "目录权限错误"; } sb2.Stop(); ((Image)CustomStorageWritableTip.Children[0]).Triggers.Remove(tg2); if (ds.Any() && result) { Settings.Storage.StorageLocation = storageLocationItems[ComboBoxStoragePath.SelectedIndex].SelectItem; Settings.Storage.UserStorageLocation = new DirectoryInfo(path).FullName; SaveSettingsToFile(); InitStorageFoldersStructure(null); StartAnalyzeStorage(); } } } private void ComboBoxStoragePath_OnSelectionChanged(object sender, SelectionChangedEventArgs e) { if (isChangingUserStorageSelectionProgramically) return; if (!isLoaded) return; if (storageLocationItems[ComboBoxStoragePath.SelectedIndex].SelectItem == "c-") { if (Settings.Storage.UserStorageLocation == "") { var folderBrowser = new System.Windows.Forms.FolderBrowserDialog(); folderBrowser.Description = "请选择ICC的自定义存储目录。不支持存储到固定硬盘除外的设备和网络地址上!"; folderBrowser.ShowDialog(); if (folderBrowser.SelectedPath.Length > 0) HandleUserCustomStorageLocation(folderBrowser.SelectedPath); else { var si = Settings.Storage.StorageLocation; var item = storageLocationItems.Where(i => i.SelectItem == si).ToArray()[0]; var index = storageLocationItems.IndexOf(item); ComboBoxStoragePath.SelectedIndex = index; } } else HandleUserCustomStorageLocation(); } else { if (isLoaded) CustomStorageLocationGroup.Visibility = ((StorageLocationItem)ComboBoxStoragePath.SelectedItem).SelectItem == "c-" ? Visibility.Visible : Visibility.Collapsed; if (isLoaded) CustomStorageLocation.Text = Settings.Storage.UserStorageLocation; Settings.Storage.StorageLocation = storageLocationItems[ComboBoxStoragePath.SelectedIndex].SelectItem; SaveSettingsToFile(); InitStorageFoldersStructure(storageLocationItems[ComboBoxStoragePath.SelectedIndex].Path); StartAnalyzeStorage(); } } private void CustomStorageLocationButton_Click(object sender, RoutedEventArgs e) { var folderBrowser = new System.Windows.Forms.FolderBrowserDialog(); folderBrowser.Description = "请选择ICC的自定义存储目录。不支持存储到固定硬盘除外的设备和网络地址上!"; folderBrowser.ShowDialog(); if (folderBrowser.SelectedPath.Length > 0) HandleUserCustomStorageLocation(folderBrowser.SelectedPath); } } }