none
Поиск и очистка файла RRS feed

  • Вопрос

  • Приветствую всех.

    Вопрос такой: нужно найти файл в заданной категории включая все подкатегории имя которого указано в textBox1 и очистить его содержимое по клику кнопки.

     

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
          string s = textBox1.Text; //Присваиваем переменной s значение равенства textBox1
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
          DirectoryInfo dir = new DirectoryInfo(@"C:\");
          foreach (FileInfo file in dir.GetFiles("s", SearchOption.AllDirectories)); //Находим текстовый файл имя которого указано в textBox1
        }
       }
      }
    
    Я пытаюсь понять как все это работает и может быть не правильно мыслю. Тут ищем файл с именем указанным в tB1 в указанной категории, включая все подкатегории. Не знаю как тлько удалить все что в нем. Наверно лучше заменить все строки на "" пустоту. Понимаю что методов несколько. Поделитесь знаниями. Если можно с комментариями самого кода

Ответы

  • Просто обнулять можно не все файлы. Даже пустые файлы, могут содержать в себе какие-либо служебные данные, например, различные заголовки. Поэтому так просто стирать все внутренности файла нельзя. Он попросту может не открыться в той программе, в которой обычно открывается. Поэтому, думаю, надо для каждого вида распространенных файлов изучать его структуру и потом писать его сброс, те обнуление тела и приведение заголовков к изначальному виду. Если возможно, то конечно, можно и все внутри затирать. Но это вначале надо узнать, возможен-ли такой подход.

     

    1. Сделайте рекурсивную процедуру, которая получает все директории и фалы у выбранной директории.

    2. После чего производит проверку файлов в текущей директории на наличие нужного.

    3. Вызывает сама себя с идущей по порядку из существующих в текущей директории директории.

     

    По коду...

    Здесь мы получаем все файлы с именем "s", находящиеся на диске "C" и циклом проходим по ним. 

    Измените строку кода так:

     foreach (FileInfo file in dir.GetFiles(textBox1.Text, SearchOption.AllDirectories));

     

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

     

    И еще, почему такой способ поиска не очень эффективный, потому что он при каждой итерации цикла будет вызывать метод GetFiles. Вынесите его до цикла, а в цикле вставьте вместо него переменную, в  которую был сохранен результат.

     

    Про метод GetFiles почитайте тут


    [My blog] [My E-mail]
    • Помечено в качестве ответа zeoman 7 мая 2011 г. 5:20
  • Если рассматривать только текстовые файлы, то можно сделать, например, так

        private void button1_Click(object sender, EventArgs e) {
          DirectoryInfo dirInf = new DirectoryInfo(@"c:\test");
          FileInfo[] files = dirInf.GetFiles(textBox1.Text, SearchOption.AllDirectories);
          foreach (FileInfo file in files)
            file.CreateText();
          }
    
    

    • Помечено в качестве ответа zeoman 7 мая 2011 г. 5:20
  • Здесь каждый из найденных файлов открывается для записи текста в кодировке UTF-8. Только проверьте, стирает-ли он все что до этого было в файле. И еще надо после этого действия закрывать поток (StreamWriter) на текущий файл, который возвращается при вызове этого метода. А то получится, что если надо будет еще раз обратиться к файлу, то вылетит исключение о том, что файл уже используется.

    Если файл не стирается, то делайте как Вы написали выше: вначале удаляйте, а потом создавайте с таким-же именем. Например, воспользоваться методом File.Create. Он создает и перезаписывает файл по указанному пути.

    File class

    File.CreateText


    [My blog] [My E-mail]
    • Помечено в качестве ответа zeoman 7 мая 2011 г. 7:01

Все ответы

  • Просто обнулять можно не все файлы. Даже пустые файлы, могут содержать в себе какие-либо служебные данные, например, различные заголовки. Поэтому так просто стирать все внутренности файла нельзя. Он попросту может не открыться в той программе, в которой обычно открывается. Поэтому, думаю, надо для каждого вида распространенных файлов изучать его структуру и потом писать его сброс, те обнуление тела и приведение заголовков к изначальному виду. Если возможно, то конечно, можно и все внутри затирать. Но это вначале надо узнать, возможен-ли такой подход.

     

    1. Сделайте рекурсивную процедуру, которая получает все директории и фалы у выбранной директории.

    2. После чего производит проверку файлов в текущей директории на наличие нужного.

    3. Вызывает сама себя с идущей по порядку из существующих в текущей директории директории.

     

    По коду...

    Здесь мы получаем все файлы с именем "s", находящиеся на диске "C" и циклом проходим по ним. 

    Измените строку кода так:

     foreach (FileInfo file in dir.GetFiles(textBox1.Text, SearchOption.AllDirectories));

     

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

     

    И еще, почему такой способ поиска не очень эффективный, потому что он при каждой итерации цикла будет вызывать метод GetFiles. Вынесите его до цикла, а в цикле вставьте вместо него переменную, в  которую был сохранен результат.

     

    Про метод GetFiles почитайте тут


    [My blog] [My E-mail]
    • Помечено в качестве ответа zeoman 7 мая 2011 г. 5:20
  • Если рассматривать только текстовые файлы, то можно сделать, например, так

        private void button1_Click(object sender, EventArgs e) {
          DirectoryInfo dirInf = new DirectoryInfo(@"c:\test");
          FileInfo[] files = dirInf.GetFiles(textBox1.Text, SearchOption.AllDirectories);
          foreach (FileInfo file in files)
            file.CreateText();
          }
    
    

    • Помечено в качестве ответа zeoman 7 мая 2011 г. 5:20
  • Если рассматривать только текстовые файлы, то можно сделать, например, так

     

      private void button1_Click(object sender, EventArgs e) {
       DirectoryInfo dirInf = new DirectoryInfo(@"c:\test");
       FileInfo[] files = dirInf.GetFiles(textBox1.Text, SearchOption.AllDirectories);
       foreach (FileInfo file in files)
        file.CreateText();
       }
    
    

     


    Можно поподробнее о этом коде ?

    Тут же удаления нет ? Только поиск файла.

    p.s. Сам файл можно не очищать. Сделать удаление файла и создание нового с таким же именем.

  • Здесь каждый из найденных файлов открывается для записи текста в кодировке UTF-8. Только проверьте, стирает-ли он все что до этого было в файле. И еще надо после этого действия закрывать поток (StreamWriter) на текущий файл, который возвращается при вызове этого метода. А то получится, что если надо будет еще раз обратиться к файлу, то вылетит исключение о том, что файл уже используется.

    Если файл не стирается, то делайте как Вы написали выше: вначале удаляйте, а потом создавайте с таким-же именем. Например, воспользоваться методом File.Create. Он создает и перезаписывает файл по указанному пути.

    File class

    File.CreateText


    [My blog] [My E-mail]
    • Помечено в качестве ответа zeoman 7 мая 2011 г. 7:01
  •  private void button1_Click(object sender, EventArgs e) {
     DirectoryInfo dirInf = new DirectoryInfo(@"c:\test");
     FileInfo[] files = dirInf.GetFiles(textBox1.Text, SearchOption.AllDirectories);
     foreach (FileInfo file in files)
     file.CreateText();
     }
    
    

    Этот код ничего не стирает.

    Попробую воспользоваться File.CreateText, но в коде есть строка 

      foreach (FileInfo file in files)
    file.CreateText();
  • Посмотрите внимательно пример по этой ссылке: File.Create. Там проверяется существует ли файл перед созданием. Если он есть, то он удаляется, а затем создается новый. Как раз, то что Вам и надо.
    [My blog] [My E-mail]
  • file.CreateText() - Если файл не существует, он будет создан. Если файл существует, его содержимое будет перезаписано. В данном случае в файл ничего не запишется, а его содержимое будет просто удалено.

    А вот поток действительно нужно закрывать. Т.е. код должен содержать следующий цикл:

          foreach (FileInfo file in files) {
            StreamWriter sr = file.CreateText();
            sr.Close();
            }