public IEnumerable <Tuple <int, string> > GetThumbnailsPaths(string filePath, string fileName, RenderAspectEnum renderType)
        {
            Tuple <int, string>[] foundFiles = null;
            string cachePath          = GetCachePath();
            string filesNameForFilter = GetComposedFileNameForFilter(fileName, filePath, renderType);

            try
            {
                if (Directory.Exists(cachePath))
                {
                    var files = UtilMethods.EnumerateFiles(cachePath, filesNameForFilter, SearchOption.AllDirectories);
                    foundFiles = files.Select(f => new Tuple <int, string>(GetFileSizeFromFileName(f), f)).ToArray();
                }
            }
            catch (Exception ex)
            {
                logger.Trace(ex, "Exception loading cache file paths for {fullpath} as {renderType}", Path.Combine(filePath, fileName), renderType.ToString());
                return(null);
            }

            /*
             * if (foundFiles == null || foundFiles.Length == 0) logger.Info("No cache files found for {filePath} as {filesNameForFilter}", Path.Combine(filePath, fileName), filesNameForFilter);
             * else logger.Info("Found {fileCount} cache files for {filePath} as {filesNameForFilter}", foundFiles.Length, Path.Combine(filePath, fileName), filesNameForFilter);
             */

            return(foundFiles);
        }
        public long CacheSize()
        {
            long   size      = 0;
            string cachePath = GetCachePath();

            try
            {
                logger.Info("Calculating cache size...");
                if (Directory.Exists(cachePath))
                {
                    foreach (var filePath in UtilMethods.EnumerateFiles(cachePath, "*.png", SearchOption.AllDirectories))
                    {
                        using (var file = File.OpenRead(filePath))
                        {
                            size += file.Length;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                logger.Trace(ex, "Exception calculating cache size");
                return(-1);
            }
            logger.Info("Calculated cache size: {size}", size);

            return(size);
        }
        public bool MoveCacheToNewLocation(CachePathType oldPath, CachePathType newPath)
        {
            string currentCachePath = GetCachePath(pathType: oldPath);
            string newCachePath     = GetCachePath(pathType: newPath);

            try
            {
                logger.Info("Moving cache folder from [{currentCachePath}] to [{newCachePath}]", currentCachePath, newCachePath);

                IEnumerable <string> cacheFiles = UtilMethods.EnumerateFiles(currentCachePath, "*.png", SearchOption.AllDirectories).ToArray();

                if (Path.GetPathRoot(currentCachePath) == Path.GetPathRoot(newCachePath))
                {
                    Directory.Move(currentCachePath, newCachePath);
                }
                else
                {
                    if (!Directory.Exists(newCachePath))
                    {
                        Directory.CreateDirectory(newCachePath);
                    }

                    foreach (string cacheFile in cacheFiles)
                    {
                        var    imageSize   = Path.GetDirectoryName(cacheFile).Split(Path.DirectorySeparatorChar).Last();
                        string newImageDir = Path.Combine(newCachePath, imageSize);

                        if (!Directory.Exists(newImageDir))
                        {
                            Directory.CreateDirectory(newImageDir);
                        }

                        File.Copy(cacheFile, Path.Combine(newImageDir, Path.GetFileName(cacheFile)), true);
                    }

                    foreach (string cacheFile in cacheFiles)
                    {
                        File.Delete(cacheFile);
                    }

                    Directory.Delete(currentCachePath, true);
                }
            }
            catch (Exception ex)
            {
                logger.Debug(ex, "Error when moving cache folder from [{currentCachePath}] to [{newCachePath}]", currentCachePath, newCachePath);
                return(false);
            }
            return(true);
        }
        public bool LoadDirectories(IEnumerable <string> paths)
        {
            IsLoading               = false;
            MainDispatcher          = Dispatcher.CurrentDispatcher;
            cancellationTokenSource = new CancellationTokenSource();
            cancellationToken       = cancellationTokenSource.Token;

            cache        = DefaultFactory.GetDefaultThumbnailCache();
            userSettings = DefaultFactory.GetDefaultUserSettings();
            renderType   = (RenderAspectEnum)userSettings.GetSettingInt(UserSettingEnum.Thumbnails3DAspect);

            logger.Info("Loading paths: Received: [{0}]", string.Join("] [", paths));
            paths = paths.Where(p1 => !paths.Any(p2 => !p1.Equals(p2) && p1.Contains(p2))).ToArray(); // Remove selected subdirectories of other selected paths.
            logger.Info("Loading paths: After removed subdirs: [{0}]", string.Join("] [", paths));

            try
            {
                IEnumerable <string> pathsFound = new List <string>();
                for (int i = 0; i < SupportedExtensionsFilter.Length; i++)
                {
                    foreach (string path in paths)
                    {
                        pathsFound = pathsFound.Concat(UtilMethods.EnumerateFiles(path, SupportedExtensionsFilter[i], SearchOption.AllDirectories, cancellationToken));
                    }
                }
                pathsFound = pathsFound.ToArray();

                if (cancellationToken.IsCancellationRequested)
                {
                    return(false);
                }

                if (pathsFound.Count() > 0)
                {
                    CalculateThumnailSizes(pathsFound.Count());
                    InitializeFoundFilesObjects(pathsFound);
                    return(true);
                }
                else
                {
                    FilesFound = new ModelFileData[0];
                }
            }
            catch (Exception ex)
            {
                logger.Trace(ex, "Unable to load: {ex}", ex.Message);
            }
            return(false);
        }
        public bool ClearCacheForFiles(IEnumerable <string> filenames)
        {
            string cachePath       = GetCachePath();
            bool   allFilesCleared = true;

            try
            {
                if (Directory.Exists(cachePath))
                {
                    var files = UtilMethods.EnumerateFiles(cachePath, "*.png", SearchOption.AllDirectories);
                    files = files.Where(f => filenames.Any(n => f.Contains(n)));
                    logger.Info("Clearing cache for specific files. Detected {fileCount} files.", files.Count());

                    foreach (var filePath in files)
                    {
                        try
                        {
                            File.Delete(filePath);
                        }
                        catch (Exception ex)
                        {
                            allFilesCleared = false;
                            logger.Trace(ex, "Error deleting cache for specific file: {filePath}", filePath);
                        }
                    }
                }
                else
                {
                    logger.Info("Clearing cache for specific files... Cache path not found! {cachePath}", cachePath);
                }
            }
            catch (Exception ex)
            {
                logger.Trace(ex, "Exception calculating cache size for specific files");
                return(false);
            }
            return(allFilesCleared);
        }
        public IEnumerable <Tuple <int, BitmapSource> > GetThumbnailsImages(string filePath, string fileName, RenderAspectEnum renderType)
        {
            Tuple <int, BitmapSource>[] loadedFiles = new Tuple <int, BitmapSource> [0];
            string cachePath          = GetCachePath();
            string filesNameForFilter = GetComposedFileNameForFilter(fileName, filePath, renderType);

            try
            {
                if (Directory.Exists(cachePath))
                {
                    var files = UtilMethods.EnumerateFiles(cachePath, filesNameForFilter, SearchOption.AllDirectories);
                    loadedFiles = new Tuple <int, BitmapSource> [files.Count()];
                    int i = 0;
                    foreach (var foundFile in files)
                    {
                        using (var file = File.OpenRead(foundFile))
                        {
                            BitmapSource bmp = LoadImageFromStream(file);
                            loadedFiles[i] = new Tuple <int, BitmapSource>(GetFileSizeFromFileName(foundFile), bmp);
                        }
                        i++;
                    }
                }
            }
            catch (Exception ex)
            {
                logger.Trace(ex, "Exception loading cache file images for {fullpath} as {renderType}", Path.Combine(filePath, fileName), renderType.ToString());
            }

            /*
             * if (loadedFiles.Length == 0) logger.Info("No cache files found for {filePath} as {filesNameForFilter}", Path.Combine(filePath, fileName), filesNameForFilter);
             * else logger.Info("Loaded {fileCount} cache files found for {filePath} as {filesNameForFilter}", loadedFiles.Length, Path.Combine(filePath, fileName), filesNameForFilter);
             */

            return(loadedFiles);
        }
        private async Task <IEnumerable <string> > AutoFillProgramsTableAsync()
        {
            string appPath          = System.IO.Path.GetDirectoryName(Assembly.GetAssembly(typeof(ConfigurationWindow)).Location);
            string programsListFile = System.IO.Path.Combine(appPath, "Content", "Autodetect3DSoftwareList.txt");

            if (!System.IO.File.Exists(programsListFile))
            {
                return(new string[0]);
            }

            string[] recognicedProgramsNames = System.IO.File.ReadAllLines(programsListFile);

            string programsFolder1 = Environment.GetFolderPath(Environment.SpecialFolder.StartMenu);
            string programsFolder2 = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
            string programsFolder3 = Environment.GetFolderPath(Environment.SpecialFolder.Favorites);
            string programsFolder4 = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Microsoft\\Internet Explorer\\Quick Launch\\User Pinned\\TaskBar");

            string[] allProgramsFolder = { programsFolder1, programsFolder2, programsFolder3, programsFolder4 };

            WshShell      shell         = new WshShell();
            List <string> addedPrograms = new List <string>();

            foreach (string programFolder in allProgramsFolder)
            {
                try
                {
                    var allShortcutsFound = UtilMethods.EnumerateFiles(programFolder, "*.lnk", SearchOption.AllDirectories);

                    foreach (string shortcutFound in allShortcutsFound)
                    {
                        try
                        {
                            IWshShortcut link = (IWshShortcut)shell.CreateShortcut(shortcutFound);

                            string exeFileName = System.IO.Path.GetFileNameWithoutExtension(link.TargetPath);
                            if (recognicedProgramsNames.Any(p => string.Equals(p, exeFileName, StringComparison.InvariantCultureIgnoreCase)))
                            {
                                if (_modelConfigSettings.LinkedProgramsData.Any(p => p.ProgramFullPath == link.TargetPath))
                                {
                                    continue;
                                }

                                var newRow = new Data.DataObjects.LinkedProgramData()
                                {
                                    ProgramName     = System.IO.Path.GetFileNameWithoutExtension(shortcutFound),
                                    ProgramFullPath = link.TargetPath,
                                    SupportSTL      = true,
                                };

                                await this.Dispatcher.BeginInvoke(() =>
                                {
                                    _modelConfigSettings.LinkedProgramsData.Add(newRow);
                                });

                                addedPrograms.Add(newRow.ProgramName);
                            }
                        }
                        catch (Exception ex)
                        {
                            logger.Debug(ex, "Settings window: AutoFillProgramsTableAsync: Exception when processing shortcut '{0}'", shortcutFound);
                        }
                    }
                }
                catch (Exception ex)
                {
                    logger.Debug(ex, "Settings window: AutoFillProgramsTableAsync: Exception when processing programs folder '{0}'", programFolder);
                }
            }
            return(addedPrograms);
        }