Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.01.2011, 17:31   #1
world12_tk
Форумчанин
 
Регистрация: 24.02.2009
Сообщений: 269
Сообщение c# удаление каталога

Здраствуйте форумчанины!!!!!
Возникла такая пробелма!
Хочу удалить папку, в которой находятся много файлов....
Вот код удаления:
Код:
 DirectoryInfo directoryinfo = new DirectoryInfo(@"C:\1");
  directoryinfo.Delete(true);
Допустим какой-то файл или запущен, или используется системой.
Тогда выдается ошибка. Как сделать так, чтобы если будет обнаружен такой файл, то его надо будет пропустить и продолжать удаление дальше?
world12_tk вне форума Ответить с цитированием
Старый 06.01.2011, 19:02   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А если по одному файлику пробовать с перехватом для каждого удаления персонально?
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            DirectoryInfo di = new DirectoryInfo(@"C:\1");
            foreach (FileInfo fi in di.GetFiles()) {
                
                try
                {
                    fi.Delete();Console.WriteLine("Уделан "+fi.FullName);
                }
                catch (System.IO.IOException e) { Console.WriteLine(fi.FullName + " Не удаляется"); }
            }
            Console.ReadKey();
        }
    }
}
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.01.2011, 19:08   #3
Neser
Пользователь
 
Аватар для Neser
 
Регистрация: 26.12.2010
Сообщений: 47
По умолчанию

В таком случае использование класса DirectoryInfo вам не подойдет. Надо создать масив обьектов ФайлИнфо. И работать с ним, поскольку директориинфо удаляет папку, а поскольку там можеть быть рабочий файл - у вас не получиться.
Попробуйте чтото в роде етого. Накинул ескизик ток что. Если что - спрашивайте.
Код:
 DirectoryInfo di = new DirectoryInfo(@"C:\1");
            FileInfo[] fi = di.GetFiles();
            foreach (FileInfo f in fi)
            {
                try
                {
                    f.Delete();
                }
                catch (Exception ex) //Лови ексепшен доступа а не простой
                {
                    Console.WriteLine(ex);
                }
            }
P.S. Чорт, опредили)
KISS - Keep It Simple Stupid

Последний раз редактировалось Neser; 06.01.2011 в 19:15.
Neser вне форума Ответить с цитированием
Старый 06.01.2011, 20:21   #4
world12_tk
Форумчанин
 
Регистрация: 24.02.2009
Сообщений: 269
По умолчанию

Neser
А если допустим у нас в данной папке, находится еще несколько подпапок, которые нужно удалить.... что тогда нужно делать?
world12_tk вне форума Ответить с цитированием
Старый 06.01.2011, 20:27   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Рекурсия.
Через Directory.GetDirectories получаешь подкаталоги, и этим же способом по ним проходись.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.01.2011, 20:32   #6
Neser
Пользователь
 
Аватар для Neser
 
Регистрация: 26.12.2010
Сообщений: 47
По умолчанию

Аналогично как с файлами, тоесть тоже создаеш масив и удаляеш всех. Вот уже полный код. Кстати с праздником)
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace DirectoryDel
{
    class Program
    {
        static void Main(string[] args)
        {
            DirectoryInfo di = new DirectoryInfo(@"C:\1");
            DirectoryInfo[] diA = di.GetDirectories() ;
            FileInfo[] fi = di.GetFiles();
            foreach (DirectoryInfo df in diA)
            {
                try
                {
                    df.Delete(true);
                }
                catch (System.IO.IOException ex)
                {
                    Console.WriteLine(ex);
                }
            }
            foreach (FileInfo f in fi)
            {
                try
                {
                    f.Delete();
                }
                catch (Exception ex) //Лови ексепшен доступа а не простой
                {
                    Console.WriteLine(ex);
                }
            }
           
            Console.Read();
        }
    }
}
KISS - Keep It Simple Stupid
Neser вне форума Ответить с цитированием
Старый 06.01.2011, 20:32   #7
Neser
Пользователь
 
Аватар для Neser
 
Регистрация: 26.12.2010
Сообщений: 47
По умолчанию

Но для того что бы процедура удаление занимала и субпапки, тоесть удаляла только те файлы которые не заняты нужно использовать рекурсию как заметил коллега)
KISS - Keep It Simple Stupid

Последний раз редактировалось Neser; 06.01.2011 в 20:54. Причина: дабл
Neser вне форума Ответить с цитированием
Старый 06.01.2011, 21:41   #8
world12_tk
Форумчанин
 
Регистрация: 24.02.2009
Сообщений: 269
По умолчанию

И вас всех с наступающем рождеством....
А не могли бы вы привести пример рекурсии.....
а то я только начинаю изучать шарп, и мне не совсем это понятно...))))
world12_tk вне форума Ответить с цитированием
Старый 06.01.2011, 22:12   #9
Neser
Пользователь
 
Аватар для Neser
 
Регистрация: 26.12.2010
Сообщений: 47
По умолчанию

Рекурсия ето когда функция, метод, процедура вызывает себя. Ето не особенность шарпа, такое бывает почти во всех языках. Вот етот код болие-мение рабочий. Тестил - работает, но все равно есть кое-какие недочеты)
Р.S. Если помог, можеш сказать спасибо нажав на весы)
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace DirectoryDel
{
    class Program
    {
        static void deleteSub(string path)
        {
            DirectoryInfo di = new DirectoryInfo(@"C:\1");
            DirectoryInfo[] diA = di.GetDirectories();
            FileInfo[] fi = di.GetFiles();
            foreach (DirectoryInfo df in diA)
            {
                try
                {
                    df.Delete(true);
                    deleteSub(df.FullName);
                }
                catch (System.IO.IOException ex)
                {
                    Console.WriteLine(ex);
                }
            }
            foreach (FileInfo f in fi)
            {
                try
                {
                    f.Delete();
                }
                catch (Exception ex) 
                {
                    Console.WriteLine(ex);
                }
            }
           
        }
        static void Main(string[] args)
        {
            string path = @"C:\1";
            deleteSub(path);
            Console.Read();
        }
    }
}
KISS - Keep It Simple Stupid
Neser вне форума Ответить с цитированием
Старый 08.01.2011, 01:47   #10
world12_tk
Форумчанин
 
Регистрация: 24.02.2009
Сообщений: 269
По умолчанию

Neserвот столкнулся с такой проблемой....
ваш код работает, спасибо вам за это...)))
Но..., когда я удаляю папку, в которой есть подкаталоги с файлами, есть файл, который используется программой. При попытки удаления его возникает ошибка в этой строчке
Код:
     df.Delete(true);
и программа дальше не пропускает его и с продолжением работы, а просто останавливается....
как сделать, чтобы она продолжала работать дальше....?
Я читал справку в MSDN. Они пишут, что можно это исправить посредством чтения доступа файла, доступен ли он для чтения или нет, но я так ничего и непонял как реализовать это....
не могли бы вы мне помочь в этом разобраться?
world12_tk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление каталога Linel PHP 11 10.03.2010 17:31
Удаление каталога Manager Общие вопросы C/C++ 1 24.10.2009 11:30
удаление каталога Volkogriz Общие вопросы Delphi 7 23.12.2008 19:36
Удаление каталога с файлами SANTA_KLAUD Общие вопросы Delphi 17 28.05.2008 17:47
Удаление непустого каталога Fia Общие вопросы Delphi 3 07.05.2007 14:11