Показать полную графическую версию : Замена одного значения подстроки на другое
необходимо сделать следующее:
- на форме должны быть 2 кнопки ("Обзор" и "Заменить"), 2 текстбокса ("Что найти" и "На что заменить");
- по нажатию на кнопку "Обзор" появляется меню, где выбирается путь к папке с файлами (вроде через OpenFileDialog можно сделать);
- в текстбоксе "Что найти" указываем то что нужно искать в файле, в текстбоксе "На что заменить" указываем на что нужно заменить то, что указали в текстбоксе "Что найти";
- по нажатию на кнопку "Заменить" каждый файл из выбраной папки построчно считывается, ищется то что было в текстбоксе "Что найти", заменяется на то что было в текстбоксе "На что заменить" и файл сохраняется.
И так необходимо сделать со всеми файлами выбранной папки.
Futtoto, что из перечисленного Вы уже реализовали? Что вызывает затруднения?
создал форму, на ней разместил 2 кнопки и 2 текстбокса.
по нажатию на кнопку Обзор появляется меню и можно выбрать папку с файлами.
далее двум строкам присвоил значения того что вводится в текстбоксы:
string find = textBox1.Text;
string replaceFind = textBox2.Text;
что делать дальше не знаю ((
по идее нужно создать массив и поместить туда все файлы из выбранной папки, затем выполнить цикл, в котором каждый файл из массива будет открываться, в нем искаться значение из текстбокса "Что найти", заменяться на то что было в текстбоксе "На что заменить"
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace Zamena
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
string find = textBox1.Text;
string replaceFind = textBox2.Text;
string fullFileName;
using (OpenFileDialog dlg = new OpenFileDialog())
{
if (dlg.ShowDialog() == DialogResult.OK)
fullFileName = dlg.FileName;
}
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
}
private void textBox2_TextChanged(object sender, EventArgs e)
{
}
private void button2_Click(object sender, EventArgs e)
{
}
}
}
Вам нужен не OpenFileDialog - класс (System.Windows.Forms) (https://msdn.microsoft.com/ru-ru/library/system.windows.forms.openfiledialog(v=vs.110).aspx), а FolderBrowserDialog - класс (System.Windows.Forms) (https://msdn.microsoft.com/ru-ru/library/system.windows.forms.folderbrowserdialog(v=vs.110).aspx). Создавать массив не нужно совершенно, нужно рекурсивно пройтись по всем каталогам, начиная с выбранного, перебирая файлы. Во время перебора именно так:
каждый файл из массива будет открываться, в нем искаться значение из текстбокса "Что найти", заменяться на то что было в текстбоксе "На что заменить" »
…и сохраняться.
ну а как это все сделать? покажите пожалуйста пример кода. я совсем-совсем новичок в программировании, меня никто не учил... все что нужно пытаюсь нагуглить, но пока безуспешно((
greg zakharov
27-06-2016, 11:20
покажите пожалуйста пример кода.Iska Вам озвучил общий алгоритм действий, так что показывать там особо нечего. Но если Вам непременно нужен код, то в самом простом виде это будет выглядеть так:
using System;
using System.IO;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Reflection;
using System.Windows.Forms;
using System.Text.RegularExpressions;
[assembly: AssemblyTitle("Replacing")]
namespace Replacing {
internal sealed class AssemblyInfo {
private Type a;
internal AssemblyInfo() { a = typeof(Program); }
internal String Title {
get {
return ((AssemblyTitleAttribute)Attribute.GetCustomAttribute(
a.Assembly, typeof(AssemblyTitleAttribute)
)).Title;
}
}
}
internal sealed class frmMain : Form {
public frmMain() {
InitializeComponent();
this.Text = new AssemblyInfo().Title;
}
private String folder; //здесь хранится путь до выбранной папки
private Label lblLabel1;
private Label lblLabel2;
private TextBox txtBox1;
private TextBox txtBox2;
private Button btnButton1;
private Button btnButton2;
private void InitializeComponent() {
this.lblLabel1 = new Label();
this.lblLabel2 = new Label();
this.txtBox1 = new TextBox();
this.txtBox2 = new TextBox();
this.btnButton1 = new Button();
this.btnButton2 = new Button();
//
//lblLabel1
//
this.lblLabel1.Height = 13;
this.lblLabel1.Location = new Point(7, 7);
this.lblLabel1.Text = "Что ищем:";
//
//lblLabel2
//
this.lblLabel2.Height = 13;
this.lblLabel2.Location = new Point(7, 51);
this.lblLabel2.Text = "На что заменяем:";
//
//txtBox1
//
this.txtBox1.Location = new Point(7, 25);
this.txtBox1.Width = 313;
//
//txtBox2
//
this.txtBox2.Location = new Point(7, 69);
this.txtBox2.Width = 313;
//
//btnButton1
//
this.btnButton1.Location = new Point(33, 101);
this.btnButton1.Text = "Обзор...";
this.btnButton1.Click += (s, e) => {
using (FolderBrowserDialog fbd = new FolderBrowserDialog()) {
if (fbd.ShowDialog() == DialogResult.OK) {
folder = fbd.SelectedPath;
}
}
};
//
//btnButton2
//
this.btnButton2.Location = new Point(213, 101);
this.btnButton2.Text = "Заменить";
this.btnButton2.Click += (s, e) => {
if (String.IsNullOrEmpty(folder) ||
String.IsNullOrEmpty(txtBox1.Text) ||
String.IsNullOrEmpty(txtBox2.Text)) {
MessageBox.Show(
"Ничего не выбрано, идите лесом!", "Ошибка",
MessageBoxButtons.OK, MessageBoxIcon.Error
);
return;
}
foreach (String file in Directory.EnumerateFiles(
folder, "*.txt", SearchOption.AllDirectories //ищем все txt файлы
)) {
String content = File.ReadAllText(file, Encoding.Default);
String n_content = Regex.Replace(content, txtBox1.Text, txtBox2.Text);
File.WriteAllText(file, n_content);
}
};
//
//frmMain
//
this.ClientSize = new Size(330, 170);
this.Controls.AddRange(new Control[] {
this.lblLabel1, this.lblLabel2, this.txtBox1,
this.txtBox2, this.btnButton1, this.btnButton2
});
this.FormBorderStyle = FormBorderStyle.FixedSingle;
this.MaximizeBox = false;
this.StartPosition = FormStartPosition.CenterScreen;
}
}
internal sealed class Program {
[STAThread]
static void Main() {
Application.EnableVisualStyles();
Application.Run(new frmMain());
}
}
}
у меня этот код нифига не работает... студия ошибки выдает
Ошибка 1
Пространство имен "WindowsFormsApplication6" уже содержит определение для "Program"
Файл - D:\C#\WindowsFormsApplication6\WindowsFormsApplication6\Program.cs
Ошибка 2
"WindowsFormsApplication6.Program": класс не может быть одновременно статическим и запечатанным
Файл - D:\C#\WindowsFormsApplication6\WindowsFormsApplication6\Form1.cs
greg zakharov
27-06-2016, 17:08
Дык а голова на что? Код за Вас накидали, Вы его тупо скопипастили и пытаетесь собрать в тухлой VS, которая и нафиг не нужна: только место занимает, да жрет системные ресурсы. Собирайте из комстроки, например:
D:\proj> D:\Windows\Microsoft.NET\vXXXX\csc.exe /nologo /t:winexe /out:replacing.exe /optimize+ /debug:pdbonly replacing.cs
Где XXXX - версия .NET, ну и конечно на будущее: если копипастите, не бздите, что код не работает, в противном случае рискуете быть гонимым ссаными тряпками.
Удачи!
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.