/// <summary>
        /// Renames files in the specified <paramref name="directory" /> with specified
        /// <paramref name="renameUsing">format</paramref>.
        /// </summary>
        /// <param name="filesOrDirectories">The files or directories path where are the files to rename.</param>
        /// <param name="recursive">If set to <c>true</c> do it recursively; otherwise do it only in specified<paramref name="directory" />.</param>
        /// <param name="renameUsing">The format used to rename.</param>
        /// <returns>A task that represents the renaming process.</returns>
        /// <exception cref="System.IO.FileNotFoundException">If a specified file or directory doesn't exists.</exception>
        public async Task RenameAsync(IEnumerable<string> filesOrDirectories, bool recursive, RenameUsing renameUsing)
        {
            if (filesOrDirectories == null)
                throw new ArgumentNullException("filesOrDirectories");

            if (!filesOrDirectories.Any())
            {
                Log.I("No files or directories specified. Do nothing.");
                return;
            }

            _scopeAnswer = DialogAnswer.None;
            var tasks = _fileSystemHelper.ProcessForEachFilesAsync(filesOrDirectories, recursive, FileFilterProvider.TagFileMatcher, (f, cts) => RenameAsync(f, renameUsing));
            await Task.WhenAll(tasks);
        }
 public override Task RenameAsync(string file, RenameUsing renameUsing)
 {
     return _self.RenameAsync(file, renameUsing);
 }
        /// <summary>
        /// Renames a file with specified <paramref name="renameUsing">format</paramref>.
        /// </summary>
        /// <param name="file">The file path to rename.</param>
        /// <param name="renameUsing">The format used to rename.</param>
        /// <returns>A task that represents the renaming process.</returns>
        /// <exception cref="System.IO.FileNotFoundException">If the <paramref name="file"/> doesn't exists.</exception>
        public virtual async Task RenameAsync(string file, RenameUsing renameUsing)
        {
            if (file == null)
                throw new ArgumentNullException("file");

            if (renameUsing == RenameUsing.None)
            {
                Log.W("Trying to rename file '{0}' using 'None' as data. No rename will be applied.", file);
                return;
            }

            if (!_file.Exists(file))
                throw new FileNotFoundException(string.Format("File '{0}' does not exists.", file));

            file = _path.GetFullPath(file);

            try
            {
                await RenameUsingDateTaken(file);
            }
            catch (Exception ex)
            {
                Exception logException = Log.IsDebugEnabled ? ex : null;
                Log.E(logException, "Error while renaming file '{0}' with message '{1}'.", file, ex.Message);
            }
        }
        /// <summary>
        /// Gets the rename tasks.
        /// </summary>
        /// <param name="directory">The directory.</param>
        /// <param name="recursive">if set to <c>true</c> [recursive].</param>
        /// <param name="renameUsing">The rename with.</param>
        /// <returns>A collection of renaming tasks.</returns>
        private IEnumerable<Task> GetRenameTasks(DirectoryInfo directory, bool recursive, RenameUsing renameUsing)
        {
            List<Task> renameTasks = ProcessFilesByExtension(directory, "jpg", (f) => RenameAsync(f, renameUsing)).ToList();
            renameTasks.AddRange(ProcessFilesByExtension(directory, "jpeg", (f) => RenameAsync(f, renameUsing)));

            if (recursive)
                renameTasks.AddRange(directory.GetDirectories().SelectMany(d => GetRenameTasks(d, true, renameUsing)));

            return renameTasks;
        }
        /// <summary>
        /// Renames the specified <paramref name="file" /> with specified <paramref name="renameUsing">format</paramref>.
        /// </summary>
        /// <param name="file">The file.</param>
        /// <param name="renameUsing">The format used to rename.</param>
        /// <returns>
        /// Task to rename.
        /// </returns>
        /// <exception cref="System.IO.FileNotFoundException">If file doesn't exists.</exception>
        public async Task RenameAsync(FileInfo file, RenameUsing renameUsing)
        {
            if (!File.Exists(file.FullName))
                throw new FileNotFoundException(file.FullName);

            switch (renameUsing)
            {
                default:
                    await RenameFileToDateTakenAsync(file);
                    break;
            }
        }
        /// <summary>
        /// Renames files in the specified <paramref name="directory" /> with specified
        /// <paramref name="renameUsing">format</paramref>.
        /// </summary>
        /// <param name="directory">The directory where are the files.</param>
        /// <param name="recursive">
        /// If set to <c>true</c> do it recursively; otherwise do it only in specified
        /// <paramref name="directory" />.
        /// </param>
        /// <param name="renameUsing">The format used to rename.</param>
        /// <exception cref="System.IO.DirectoryNotFoundException">If directory doesn't exists.</exception>
        public async Task RenameAsync(DirectoryInfo directory, bool recursive, RenameUsing renameUsing)
        {
            if (!Directory.Exists(directory.FullName))
                throw new DirectoryNotFoundException(directory.FullName);

            var tasks = GetRenameTasks(directory, recursive, renameUsing);

            await Task.WhenAll(tasks);
        }