Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.80/603: Рейтинг темы: голосов - 603, средняя оценка - 4.80
22 / 22 / 11
Регистрация: 02.04.2009
Сообщений: 205
1

Получить список файлов и папок в подкаталоге

18.09.2010, 17:42. Показов 110762. Ответов 27
Метки нет (Все метки)

Здравствуйте

как сделать см. тему ???

фалйы знаю FileInfo а вот каталоги как ?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.09.2010, 17:42
Ответы с готовыми решениями:

Показ список файлов из определенных папок
Здравствуйте. Короче идея такая. Есть некоторые виды папок DATA Campaigns Downloads Maps...

Получить список файлов в Zip
На входе есть архив, мне нужно получить список файлов из него, как можно реализовать это?

Получить список файлов и записать их в treeview
Здравствуйте, пытаюсь получить список файлов из папки Log и записать их в treeview, пока понял что...

Получить список зарегистрированных в системе типов файлов
Привет всем! Подскажите, пожалуйста, каким образом средствами .NET (C# или VB) получить список...

27
2093 / 1257 / 170
Регистрация: 01.02.2009
Сообщений: 2,842
18.09.2010, 17:47 2
Получение списка каталогов:
C#
1
2
3
4
5
6
DirectoryInfo dir = new DirectoryInfo(@"D:\Temp");
            foreach (var item in dir.GetDirectories())
            {
                Console.WriteLine(item.Name);
            }
            Console.ReadLine();
5
624 / 495 / 43
Регистрация: 05.07.2010
Сообщений: 1,589
18.09.2010, 17:48 3
Directory.GetDirectories
Получает имена подкаталогов в указанном каталоге
возвращается массив имен подкаталогов

public static string[] GetDirectories(string path)
1
22 / 22 / 11
Регистрация: 02.04.2009
Сообщений: 205
18.09.2010, 17:49  [ТС] 4
kirill29, а каталоги в подкаталогах будет получать ?
0
2093 / 1257 / 170
Регистрация: 01.02.2009
Сообщений: 2,842
18.09.2010, 17:54 5
Лучший ответ Сообщение было отмечено как решение

Решение

С подкаталогами:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
using System;
using System.IO;
 
namespace ConsoleApplication15
{
    class Program
    {
        static void Main(string[] args)
        {
            DirectoryInfo dir = new DirectoryInfo(@"D:\Temp");
            Console.WriteLine("============Список каталогов=============");
            foreach (var item in dir.GetDirectories())
            {
                Console.WriteLine(item.Name);
                Console.WriteLine("==Список подкаталогов==");
                foreach (var it in item.GetDirectories())
                    Console.WriteLine(it.Name);
                Console.WriteLine();
            }
            Console.WriteLine("==============Список файлов==============");
            foreach (var item in dir.GetFiles())
            {
                Console.WriteLine(item.Name);
            }
            Console.ReadLine();
        }
    }
}
8
22 / 22 / 11
Регистрация: 02.04.2009
Сообщений: 205
18.09.2010, 22:01  [ТС] 6
код не доработан
0
Почетный модератор
Эксперт .NET
8701 / 3653 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
18.09.2010, 22:22 7
Цитата Сообщение от 4iNo Посмотреть сообщение
код не доработан
Что вы подразумеваете? Вы просили, Вам ответили.

Добавлено через 15 минут
Вам нужен рекурсивный перебор?
1
22 / 22 / 11
Регистрация: 02.04.2009
Сообщений: 205
19.09.2010, 00:10  [ТС] 8
папка1
- папка2
--папка3
--папка4
---папка5
0
Почетный модератор
Эксперт .NET
8701 / 3653 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
19.09.2010, 00:27 9
Вот пример для консоли:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
/// <summary>
/// Создание дерева каталогов.
/// </summary>
/// <param name="Dir">Начальная папка.</param>
/// <param name="Sub">Искать в подпапках.</param>
/// <param name="Ws">Поток куда записывать дерево.</param>
/// <param name="Level">Уровень вложенности (не используется).</param>
/// <returns>Возвращает True, если начальная папка существует, иначе False.</returns>
static bool CreateTree(string Dir, bool Sub,
    [Optional] StreamWriter Ws, [Optional] bool DisposeStream, [Optional] int Level) {
    if (!Directory.Exists(Dir))
        return false;
 
    string pad = new string('-', Level++);
    try {
        string[] files = Directory.GetFiles(Dir);
        if (Ws == null)
            Console.WriteLine(string.Concat(pad, " ", Dir));
        else
            Ws.WriteLine(string.Concat(pad, " ", Dir));
        pad += "-";
        foreach (string file in files)
            if (Ws == null)
                Console.WriteLine(string.Concat(pad, " ", Path.GetFileName(file)));
            else
                Ws.WriteLine(string.Concat(pad, " ", Path.GetFileName(file)));
        if (Sub) {
            foreach (string folder in Directory.GetDirectories(Dir)) {
                CreateTree(folder, Sub, Ws, false, Level);
            }
        }
    }
    catch (Exception ex) {
        if (Ws == null)
            Console.WriteLine(string.Concat(pad, " Exception: ", ex.Message));
        else
            Ws.WriteLine(string.Concat(pad, " Exception: ", ex.Message));
    }
    finally {
        if (DisposeStream && Ws != null)
        {
            Ws.Flush();
            Ws.Close();
            Ws.Dispose();
            Ws = null;
        }
    }
    return true;
}
 
// Использование:
CreateTree("X:\\", true);
Добавлено через 13 минут
p.s. Пример для 2010 студии...
2
7 / 7 / 0
Регистрация: 15.04.2011
Сообщений: 47
04.02.2013, 13:22 10
Цитата Сообщение от SSTREGG Посмотреть сообщение
Вот пример для консоли:
А не проще так:
C#
1
string[] files = Directory.GetFiles(directory, extensionPattern, SearchOption.AllDirectories);
или так:
C#
1
IEnumerable<string> files = Directory.EnumerateFiles(directory, extensionPattern, SearchOption.AllDirectories);
Причем второй асинхронный.
2
Почетный модератор
Эксперт .NET
8701 / 3653 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
04.02.2013, 19:36 11
Цитата Сообщение от FullSilence Посмотреть сообщение
А не проще так
А если exception во время попытки получения доступа к какой-нибудь папке/файлу, что делать будете?
Цитата Сообщение от FullSilence Посмотреть сообщение
Причем второй асинхронный
В каком месте?

з.ы. 2.5 года прошло...
1
62 / 62 / 5
Регистрация: 05.01.2013
Сообщений: 235
04.02.2013, 20:23 12
как то писал для форума рекурсивную функцию для получения всех подкаталогов в каталоге, вот :
C#
1
2
3
4
5
6
7
8
9
10
11
void getallfile(string startdirectory,ListBox filess){
            string[] searchdirectory=Directory.GetDirectories(startdirectory);
            if (searchdirectory.Length>0){
                for (int i = 0; i <searchdirectory.Length; i++) {
                    getallfile(searchdirectory[i]+@"\",filess);
                }
            }
            string [] filesss=Directory.GetFiles(startdirectory);
            for (int i = 0; i < filesss.Length; i++) {
                filess.Items.Add(filesss[i]);
        }
еще и файлы ищет. но поправить не проблема
в listbox добавляет для наглядности. это пример.
0
605 / 580 / 157
Регистрация: 29.06.2010
Сообщений: 1,620
06.02.2013, 17:52 13
Цитата Сообщение от SSTREGG Посмотреть сообщение
з.ы. 2.5 года прошло...
ахаха, некропостеры =))
0
48 / 48 / 5
Регистрация: 11.07.2011
Сообщений: 282
01.03.2013, 11:35 14
SSTREGG, Я конечно могу ошибаться, но на мой скромный взгляд Ваш код очень уж низкоуровневый.
Не проще ли ту единственную строчку с методом Getfiles (который специально предназначен для получения файлов в том числе и в подкаталогах) в предыдущих постах обернуть в try catch и отловить нужный Exception ?
Из 7 указанных возможных исключений 6 имеют отношение к параметру path и лишь один указывает на то,
что у вызывающего объекта отсутствует необходимое разрешение.
Как пример:

C#
1
2
3
4
5
6
7
try {
  string[] files = Directory.GetFiles(directory, extensionPattern, SearchOption.AllDirectories);
} catch(UnauthorizedAccessException uex){
//обработка искл.
} catch(Exception ex){
//обработка искл.
}

Цитата Сообщение от SSTREGG Посмотреть сообщение
Вот пример для консоли:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
/// <summary>
/// Создание дерева каталогов.
/// </summary>
/// <param name="Dir">Начальная папка.</param>
/// <param name="Sub">Искать в подпапках.</param>
/// <param name="Ws">Поток куда записывать дерево.</param>
/// <param name="Level">Уровень вложенности (не используется).</param>
/// <returns>Возвращает True, если начальная папка существует, иначе False.</returns>
static bool CreateTree(string Dir, bool Sub,
    [Optional] StreamWriter Ws, [Optional] bool DisposeStream, [Optional] int Level) {
    if (!Directory.Exists(Dir))
        return false;
 
    string pad = new string('-', Level++);
    try {
        string[] files = Directory.GetFiles(Dir);
        if (Ws == null)
            Console.WriteLine(string.Concat(pad, " ", Dir));
        else
            Ws.WriteLine(string.Concat(pad, " ", Dir));
        pad += "-";
        foreach (string file in files)
            if (Ws == null)
                Console.WriteLine(string.Concat(pad, " ", Path.GetFileName(file)));
            else
                Ws.WriteLine(string.Concat(pad, " ", Path.GetFileName(file)));
        if (Sub) {
            foreach (string folder in Directory.GetDirectories(Dir)) {
                CreateTree(folder, Sub, Ws, false, Level);
            }
        }
    }
    catch (Exception ex) {
        if (Ws == null)
            Console.WriteLine(string.Concat(pad, " Exception: ", ex.Message));
        else
            Ws.WriteLine(string.Concat(pad, " Exception: ", ex.Message));
    }
    finally {
        if (DisposeStream && Ws != null)
        {
            Ws.Flush();
            Ws.Close();
            Ws.Dispose();
            Ws = null;
        }
    }
    return true;
}
 
// Использование:
CreateTree("X:\\", true);
Добавлено через 13 минут
p.s. Пример для 2010 студии...
0
1451 / 844 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
01.03.2013, 12:17 15
Цитата Сообщение от Dimblch Посмотреть сообщение
Не проще ли ту единственную строчку с методом Getfiles (который специально предназначен для получения файлов в том числе и в подкаталогах) в предыдущих постах обернуть в try catch и отловить нужный Exception ?
Но при этом ваш алгоритм перебора прервётся полностью, а тот НИЗКОУРОВНЕННЫЙ вполне может продолжить перебор после ошибки.
0
48 / 48 / 5
Регистрация: 11.07.2011
Сообщений: 282
01.03.2013, 14:40 16
В алгоритме SSTREGG тоже есть вызов метода string[] files = Directory.GetFiles(Dir);
вызов которого может привести к исключению. Вы думаете после исключения в нем метод продолжит работу?
Явно видно, что нет.
Управление пойдет в блок catch а дальше на выход. после finally..
0
Почетный модератор
Эксперт .NET
8701 / 3653 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
01.03.2013, 23:52 17
Dimblch, выполнение будет прервано только если exception вылетит на первом GetFiles или GetDirectories, в других случаях выполнение продолжится, но список будет неполным. Единственный GetFiles вообще ничего не вернет в случае ошибки.

Раз уж подняли тему 2-х летней давности и начали обсуждать код, то предложу другой вариант: использование WinAPI в связке со Stack'ом.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
        [StructLayout( LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 1 )]
        struct WIN32_FIND_DATA
        {
            public uint dwFileAttributes;
            public long ftCreationTime;
            public long ftLastAccessTime;
            public long ftLastWriteTime;
            public uint nFileSizeHigh;
            public uint nFileSizeLow;
            private uint dwReserved0;
            private uint dwReserved1;
            [MarshalAs( UnmanagedType.ByValTStr, SizeConst = 260 )]
            public string cFileName;
            [MarshalAs( UnmanagedType.ByValTStr, SizeConst = 14 )]
            public string cAlternateFileName;
        }
 
        private const string KERNEL32 = "kernel32.dll";
 
        [DllImport( KERNEL32, SetLastError = true, CharSet = CharSet.Unicode )]
        static extern IntPtr FindFirstFile (
            string lpFileName,
            ref WIN32_FIND_DATA lpFindFileData
            );
 
        [DllImport( KERNEL32, SetLastError = true, CharSet = CharSet.Unicode )]
        [return: MarshalAs( UnmanagedType.Bool )]
        static extern bool FindNextFile (
            IntPtr hFindFile,
            out WIN32_FIND_DATA lpFindFileData
            );
 
        [DllImport( KERNEL32, SetLastError = true )]
        [return: MarshalAs( UnmanagedType.Bool )]
        static extern bool FindClose (
            IntPtr hFindFile
            );
 
        static List<string> CreateTree ( string Dir, bool SubDir )
        {
            const string unicode_version = @"\\?\";
 
            var stack = new Stack<string>();
            var list = new List<string>();
            var wfd = new WIN32_FIND_DATA();
            IntPtr hFile;
 
            stack.Push( Dir );
 
            do
            {
                string path;
 
                do
                {
                    list.Add( Dir = stack.Pop() );
                    path = unicode_version + Path.Combine( Dir, "*" );
                    hFile = FindFirstFile( path, ref wfd );
                } while ( hFile == (IntPtr)(-1) );
 
                do
                {
                    if ( wfd.cFileName == "." || wfd.cFileName == ".." )
                        continue;
 
                    path = Path.Combine( Dir, wfd.cFileName );
 
                    if ( (wfd.dwFileAttributes & 0x10) != 0 && SubDir )
                        stack.Push( path );
                    else
                        list.Add( path );
                } while ( FindNextFile( hFile, out wfd ) );
 
                FindClose( hFile );
            } while ( stack.Count != 0 );
 
            return list;
        }
Использование:
C#
1
CreateTree( @"X:\", true );
3
48 / 48 / 5
Регистрация: 11.07.2011
Сообщений: 282
02.03.2013, 01:11 18
Здорово!
0
177 / 25 / 1
Регистрация: 21.03.2011
Сообщений: 51
19.04.2013, 20:00 19
Зашел сюда с гугла в поиске ответа на свой вопрос совпадающий с вопросом данной темы. Посмотрел на код в предыдущих постах и решил, что лучше бужу писать сам. И написал.
C#
1
2
3
4
5
6
7
8
9
10
        private void button1_Click(object sender, EventArgs e)
        {
            IEnumerable<string> Dir = Directory.EnumerateDirectories(@"C:\Users\Pashe4ka13\Desktop\html","*",SearchOption.AllDirectories);
            //EnumerateFiles(@"C:\Users\Pashe4ka13\Desktop\html","*.php",SearchOption.AllDirectories); все фаилы php
            foreach (string dir in Dir)
            {
                textBox1.Text += dir+"\r\n";
            }
        }
    }
2
1510 / 633 / 62
Регистрация: 31.03.2009
Сообщений: 2,047
19.04.2013, 20:27 20
Цитата Сообщение от pashe4ka13 Посмотреть сообщение
C#
1
textBox1.Text += dir+"\r\n";
Бить лопатой по хребту надо за такую работу со строками.

Цитата Сообщение от pashe4ka13 Посмотреть сообщение
Посмотрел на код в предыдущих постах и решил, что лучше бужу писать сам. И написал.
А ощущение, что тему ты не читал. Влеплю-ка я тебе минус в репутацию.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.04.2013, 20:27

Получить список файлов с возможностью их физ. удаления
Пишу не большой Tweaker. Предположим, имеется следующая структура файлов:...

Получить список выделенных файлов из контекстного меню Windows
Задача такая необходимо получить имена с путями выделенных файлов по нажатию на контекстном меню...

Как получить список выбранных файлов через контекстное меню?
Приветствую! Я в реестре создал свой пункт меню с командой @=&quot;MyTest.exe %1&quot; Если я выбираю один...

Как получить список директорий и файлов (не расшаренных) сетевого компа при условии Full Access?
Как получить список директорий (файлов) (не расшаренных) сетевого компа (при условии Full Access)....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru