Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Замена одного значения подстроки на другое (http://forum.oszone.net/showthread.php?t=316222)

Futtoto 26-06-2016 21:32 2645808

Замена одного значения подстроки на другое
 
необходимо сделать следующее:

- на форме должны быть 2 кнопки ("Обзор" и "Заменить"), 2 текстбокса ("Что найти" и "На что заменить");
- по нажатию на кнопку "Обзор" появляется меню, где выбирается путь к папке с файлами (вроде через OpenFileDialog можно сделать);
- в текстбоксе "Что найти" указываем то что нужно искать в файле, в текстбоксе "На что заменить" указываем на что нужно заменить то, что указали в текстбоксе "Что найти";
- по нажатию на кнопку "Заменить" каждый файл из выбраной папки построчно считывается, ищется то что было в текстбоксе "Что найти", заменяется на то что было в текстбоксе "На что заменить" и файл сохраняется.

И так необходимо сделать со всеми файлами выбранной папки.

Iska 26-06-2016 22:40 2645822

Futtoto, что из перечисленного Вы уже реализовали? Что вызывает затруднения?

Futtoto 26-06-2016 23:15 2645830

создал форму, на ней разместил 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)
{


}

}
}

Iska 27-06-2016 00:34 2645839

Вам нужен не OpenFileDialog - класс (System.Windows.Forms), а FolderBrowserDialog - класс (System.Windows.Forms). Создавать массив не нужно совершенно, нужно рекурсивно пройтись по всем каталогам, начиная с выбранного, перебирая файлы. Во время перебора именно так:
Цитата:

Цитата Futtoto
каждый файл из массива будет открываться, в нем искаться значение из текстбокса "Что найти", заменяться на то что было в текстбоксе "На что заменить" »

…и сохраняться.

Futtoto 27-06-2016 06:40 2645858

ну а как это все сделать? покажите пожалуйста пример кода. я совсем-совсем новичок в программировании, меня никто не учил... все что нужно пытаюсь нагуглить, но пока безуспешно((

greg zakharov 27-06-2016 11:20 2645913

Цитата:

Цитата Futtoto
покажите пожалуйста пример кода.

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());
    }
  }
}


Futtoto 27-06-2016 14:17 2645967

у меня этот код нифига не работает... студия ошибки выдает

Ошибка 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 2646009

Дык а голова на что? Код за Вас накидали, Вы его тупо скопипастили и пытаетесь собрать в тухлой VS, которая и нафиг не нужна: только место занимает, да жрет системные ресурсы. Собирайте из комстроки, например:
Код:

D:\proj> D:\Windows\Microsoft.NET\vXXXX\csc.exe /nologo /t:winexe /out:replacing.exe /optimize+ /debug:pdbonly replacing.cs
Где XXXX - версия .NET, ну и конечно на будущее: если копипастите, не бздите, что код не работает, в противном случае рискуете быть гонимым ссаными тряпками.
Удачи!


Время: 15:35.

Время: 15:35.
© OSzone.net 2001-