Программа для добавления/удаления строки к именам файлов в папке. Часть 1.
Как-то раз столкнулся с такой проблемой. Понадобилось добавить к именам всех файлов в папке одну и ту же строку, но так как файлов было очень много (10-ки тысяч) вручную это сделать не представлялось возможным. Вот и пришла в голову идея написать маленькую программу, которая добавляет строку к имени файла и может удалять символы, начиная с введенного индекса.
Программу писал на основе технологии WPF. Для того чтобы потренироваться с применением архитектурных паттернов, принял решение реализовать проект с использованием MVVM (о нем расскажу в отдельной статье). Unit тестирование не добавлял, в случае развития проекта (есть идеи добавить еще какой-нибудь функционал) добавлю.
Создание проекта и определение структуры.
В VS создаем новый проект "Приложение WPF". Через «Диспетчер пакетов NuGet» устанавливаем библиотеку MVVM Ligth (хорошая библиотека, которая создает уже определенную логику и макет проекта). Она нам создаст папку ViewModel, в которой находятся два класса ViewModelLocator (помогает с Binding’ом данных и создает экземпляр класса ViewModel) и MainViewModel (в нем содержится логика для представления MainWindow), они нам нужны, для того чтобы развязать представление от бизнес логики приложения. Добавим так же папки Views и Helpers, в первую переместим все файлы представлений (он у нас пока один), а во второй будут храниться классы, которые помогут отправлять Messages из ViewModel во View.
Таким образом, мы реализовали структуру проекта (в простом варианте, без классов моделей).
Создание представления.
Графический интерфейс у нас будет состоять из двух вкладок:
• добавление строк к имени файла
• удаление символов из имени файла
На рисунке ниже показано, как выглядит первая вкладка
На ней есть поле для ввода пути до папки, в которой будут переименовываться файлы, а справа кнопка для вызова диалогового окна выбора папки.
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition Width="30"/>
</Grid.ColumnDefinitions>
<TextBox Grid.Column="0" Name="PathToFolderAddString_tb"
Text="{Binding PathToFilesForAddString_Renamer,
Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
<Button Grid.Column="1" Name="BrowseFolderAddString_btn" Content="..."
Click="BrowseFolderAddString_btn_OnClick"/>
</Grid>
Пришлось использовать класс FolderBrowserDialog из библиотеки System.Windows.Forms, так как в WPF нет встроенного класса с таким диалоговым окном.
Код для метода Click кнопки BrowseFolderAddString_btn.
private void BrowseFolderAddString_btn_OnClick(object sender, RoutedEventArgs e)
{
FolderBrowserDialog fbd = new FolderBrowserDialog();
fbd.Description = "Выберите путь до папки с файлами";
if (fbd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
PathToFolderAddString_tb.Text = fbd.SelectedPath;
}
}
Ниже расположены три TextBox’а, в которые нужно ввести текст для добавления.
<Label Content="Добавить текст до:"/>
<TextBox Name="AddTextBefore_tb" Text="{Binding StringBeforeFileName_Renamer,
UpdateSourceTrigger=PropertyChanged}"/>
<Label Content="Добавить текст после:"/>
<TextBox Name="AddTextAfter_tb" Text="{Binding StringAfterFileName_Renamer,
UpdateSourceTrigger=PropertyChanged}"/>
<StackPanel Orientation="Horizontal">
<Label Content="Вставить текст на позицию: "/>
<xctk:IntegerUpDown Minimum="0" Margin="10 5 0 5" Text="{Binding InputPosition_Renamer,
UpdateSourceTrigger=PropertyChanged}"/>
</StackPanel>
<TextBox Name="InsertTextOnPosition_td" Text="{Binding InsertTextOnPosition_Renamer,
UpdateSourceTrigger=PropertyChanged}"/>
Справа Button для выполнения переименования и CheckBox, который запускает непрерывное сканирование на появление событий связанных с выбранной папкой (такие события как: добавление, удаление, переименование файлов).
<GroupBox Header="Запуск переименовывания" Grid.Column="1" Margin="5" Padding="5">
<StackPanel Margin="10">
<Button Name="RenameFilesOneTime_btn" Command="{Binding RenameFiles_Renaimer_Command}"
Content="Переименовать файлы" />
<CheckBox Margin="0 10 0 10" IsChecked="{Binding AutoWatchingForFolder,
UpdateSourceTrigger=PropertyChanged}">
<TextBlock Text="Автоматически переименовывать файлы при появлении в папке"
TextWrapping="Wrap"/>
<i:Interaction.Triggers>
<i:EventTrigger EventName="Checked">
<i:InvokeCommandAction
Command="{Binding StartWatchingForFolder_Renaimer_Command}"/>
</i:EventTrigger>
<i:EventTrigger EventName="Unchecked">
<i:InvokeCommandAction
Command="{Binding StopWatchingForFolder_Renaimer_Command}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</CheckBox>
</StackPanel>
</GroupBox>
Все изменения будут отображаться в логах.
При добавлении новых файлов в папку они будут автоматически переименовываться по заданному правилу.
Вторая вкладка выполнена в аналогичном стиле.
Есть два TextBox для ввода начального индекса и количества удаляемых символов. Также есть возможность выбора порядка удаления, с начала или с конца имени файла.
Код представлен ниже.
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<!--Путь к файлам и настройка переименования-->
<GroupBox Header="Настройки" Margin="5" Padding="2">
<StackPanel>
<Label Content="Путь к файлам:"/>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition Width="30"/>
</Grid.ColumnDefinitions>
<TextBox Grid.Column="0" Name="PathToFolderDeleteString_tb"
Text="{Binding PathToFilesForDeleteString_Renamer,
Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
<Button Grid.Column="1" Name="BrowseFolderDeleteString_btn" Content="..."
Click="BrowseFolderDeleteString_btn_OnClick"/>
</Grid>
<Label Content="Порядок удаления:"/>
<StackPanel Orientation="Horizontal">
<RadioButton GroupName="turn" Content="Начало=>Конец" Margin="5" IsChecked="{Binding BeginningOrEnd}" />
<RadioButton GroupName="turn" Content="Конец=>Начало" Margin="5"/>
</StackPanel>
<Label Content="Начать с:"/>
<TextBox Name="StartPoint_tb" Text="{Binding StartPointForDelete_Renaimer}"/>
<Label Content="Сколько удалять:"/>
<TextBox Name="NumCharForDelete_tb" Text="{Binding NumOfCharForDelete_Renaimer}"/>
</StackPanel>
</GroupBox>
<!--Запуск переименования-->
<GroupBox Header="Запуск переименовывания" Grid.Column="1" Margin="5" Padding="5">
<StackPanel Margin="10">
<Button Name="RenameFilesDeleteString_btn" Command="{Binding DeleteStringFromFileName_Command}"
Content="Переименовать файлы" />
</StackPanel>
</GroupBox>
</Grid>
На этом этапе заканчивается процесс создания визуальной части приложения. Если есть какие-то вопросы, то пишите в комментарии
Во второй части я расскажу как реализовать класс ViewModel и логику выполнения переименования файлов. Ссылка на исходный код программы будет там же.