Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сканирование папки ? 
:(
    Опции темы
Miller_time
Дата 9.2.2007, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 641
Регистрация: 8.9.2006
Где: Нижний Новгород

Репутация: нет
Всего: 1



Как просканировать папку на файлы ? Мне надо получить кол-во файлов и имена ? Такое реально сделать ? 


--------------------
Мы делаем игрыЗДЕСЬ
PM MAIL WWW ICQ   Вверх
nankko
Дата 9.2.2007, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 8.2.2007

Репутация: нет
Всего: нет



Цитата(Miller_time @ 9.2.2007,  12:18)
Как просканировать папку на файлы ? Мне надо получить кол-во файлов и имена ? Такое реально сделать ?

да,и очень просто)))

    
Код

    string [] FileNameMasTemp = Directory.GetFiles(path);
    int IndexOfFiles=FileNameMasTemp.Length;


Итого,в массиве все имена файлов в заланной дериктории, и размер самого массива т.е кол-во файлов,потом с массивом можешь делать что хочешь))))

Это сообщение отредактировал(а) nankko - 9.2.2007, 14:41
PM MAIL   Вверх
Tror
Дата 9.2.2007, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 29.4.2005
Где: Кишинёв

Репутация: 2
Всего: 4



а реально немного поиском воспользоваться?

Код

DirectoryInfo.GetDirectories()
DirectoryInfo.GetFiles()  


--------------------
Не говори всегда что знаешь, но знай всегда что говоришь. /Клавдий/============================================Кто может -- тот делает. Кто не может... тот получает сертификат MCSE ;)
PM MAIL ICQ   Вверх
Miller_time
Дата 12.2.2007, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 641
Регистрация: 8.9.2006
Где: Нижний Новгород

Репутация: нет
Всего: 1



А как получить конкретный файл из списка ? Тоесть выдернуть из массива ? его путь. и название


--------------------
Мы делаем игрыЗДЕСЬ
PM MAIL WWW ICQ   Вверх
Tror
Дата 12.2.2007, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 29.4.2005
Где: Кишинёв

Репутация: 2
Всего: 4



а вот мне интересно ты на самом деле не мог найти или издеваешься?

DirectoryInfo.GetFiles() возвращает массив FileInfo, в котором есть вся необходимая тебе инфа
--------------------
Не говори всегда что знаешь, но знай всегда что говоришь. /Клавдий/============================================Кто может -- тот делает. Кто не может... тот получает сертификат MCSE ;)
PM MAIL ICQ   Вверх
Stepan_Lameroff
Дата 12.2.2007, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 16.12.2006

Репутация: 9
Всего: 14



PM MAIL   Вверх
Kvazilol
Дата 18.4.2007, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 7.12.2006

Репутация: нет
Всего: нет



окей, пишу я, скажем

Drive.RootDirectory.GetFiles("*.zip", System.IO.SearchOption.AllDirectories)

по идее вернутся все зип файлы в моем случае на диске C

не тут то было!!! выскакивается исключение

Код

System.UnauthorizedAccessException was unhandled
  Message="Access to the path 'C:\\System Volume Information' is denied."
  Source="mscorlib"
  StackTrace:
       at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
       at System.IO.Directory.InternalGetFileDirectoryNames(String path, String userPathOriginal, String searchPattern, Boolean includeFiles, Boolean includeDirs, SearchOption searchOption)
       at System.IO.DirectoryInfo.GetFiles(String searchPattern, SearchOption searchOption)
       at hashi1.Program.Main(String[] args) in C:\Projects\C#\cryptolog\hashi1\hashi1\Program.cs:line 39
       at System.AppDomain.nExecuteAssembly(Assembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()


в доступе к какойто там подпапке отказано. как решить проблему!?
попробывал так - 
Код

Drive.RootDirectory.SetAccessControl(new System.Security.AccessControl.DirectorySecurity(Drive.RootDirectory.FullName,System.Security.AccessControl.AccessControlSections.Audit))


 выставил какоето право доступа Audit. но всеравно исключение. при любомчлене перечисления AccessControlSections возникает исключение... как быть!? 

 мне нужно получить все "*.zip" файлы на диске. эти файлы будут использоваться только на чтение. если на диске папка которую нельзя открывать то пусть прогамма ее не открывает!! как это сделать то!?..   smile  ( делать наколенный рекурсивный обход папок ? это нехорошо..)

Это сообщение отредактировал(а) Kvazilol - 18.4.2007, 22:20
PM MAIL   Вверх
mr.DUDA
Дата 19.4.2007, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Не все директории доступны на получение списка файлов, и обрабатывать это нужно с пом. try..catch.

Пример - System Volume Information. Другой пример - сбойная запись в таблице FAT. Ещё пример - директория, к которой текущему пользователю запретил доступ системный администратор.


--------------------
user posted image
PM MAIL WWW   Вверх
Kvazilol
  Дата 19.4.2007, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 7.12.2006

Репутация: нет
Всего: нет



ну и не хочу я лезть куда нельзя.  я хочу получить то что мне можно получать.  как это сделать !?  неужели нет таких универсальных решений?
PM MAIL   Вверх
Naum
Дата 19.4.2007, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 743
Регистрация: 7.9.2005
Где: Саратов, ул. Поса дского, 298

Репутация: 8
Всего: 15



Цитата(Kvazilol @  19.4.2007,  13:04 Найти цитируемый пост)
неужели нет таких универсальных решений?

Последнее время, что-то часто такой вопрос встречается. Никто ничего не хочет делать. Все хотят, чтоб все уже было готово. smile
Ну ты подумай, откуда разработчикам, которые находятся за несколько км от тебя и скорее всего ничего не знают о твоем существовании, знать к каким папкам у тебя есть доступ, а к каким нет, и вообще какие у тебя там папки? Неужели так трудно добавить парочку try-catch'ев? Тем более в твоем случае всего одни.



--------------------
У нас всего два праздника Новый год и ТЯПница.
PM MAIL ICQ   Вверх
Kvazilol
Дата 19.4.2007, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 7.12.2006

Репутация: нет
Всего: нет



да дело не в том что мне не нравится что происходит исключение.
дело в том что исключения происходят по самым незначительным причинам.. если бы можно было както параметризовать то может быть их не было бы (выставить так что я хочу получить те папки к которым можно получить доступ).
а так придётся мне делать рекурсивный обход папок... пфе.. и не только мне а всем у кого задача - всеголиш получить все папки или папки в данной папке
PM MAIL   Вверх
Naum
Дата 19.4.2007, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 743
Регистрация: 7.9.2005
Где: Саратов, ул. Поса дского, 298

Репутация: 8
Всего: 15



Цитата(Kvazilol @  19.4.2007,  14:11 Найти цитируемый пост)
выставить так что я хочу получить те папки к которым можно получить доступ

Ну да. Такого к сожалению нет.
Цитата(Kvazilol @  19.4.2007,  14:11 Найти цитируемый пост)
а так придётся мне делать рекурсивный обход папок

А ты знаешь другие способы?
Цитата(Kvazilol @  19.4.2007,  14:11 Найти цитируемый пост)
получить все папки

То есть, допустим у меня есть папки C:\FFolder, C:\FFolder\FFFolder, C:\SFolder. Ты хочешь, чтоб вывело просто FFolder, FFFolder, SFolder?
Цитата(Kvazilol @  19.4.2007,  14:11 Найти цитируемый пост)
папки в данной папке

DirectoryInfo.GetDirectories() именно для этого и служит. И когда ты, например, захочешь получить список всех папок в корне системного диска, этот метод даст тебе список всех папок в корне системного диска, включая и те, к которым доступ запрещен. Например, System Volume Information. Однако, когда ты захочешь получить список папок в папке System Volume Information по вполне понятным причинам вылетит ошибка.




--------------------
У нас всего два праздника Новый год и ТЯПница.
PM MAIL ICQ   Вверх
Kvazilol
Дата 19.4.2007, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 43
Регистрация: 7.12.2006

Репутация: нет
Всего: нет



вот сваял такой класс
Код

using System;
using System.Collections.Generic;
using System.Text;

namespace hashi1
{
    class FileSearcher
    {
        private List<System.IO.FileInfo> Files;
        private List<string> Extensions;
        private System.IO.DirectoryInfo Directory;

        public FileSearcher(List<string> Extensions, System.IO.DirectoryInfo Directory)
        {
            this.Directory = Directory;
            this.Extensions = Extensions;
            Files = new List<System.IO.FileInfo>();
        }
        private List<System.IO.FileInfo> FindedFiles
        {
            get
            {
                return Files;
            }
        }
        public List<System.IO.FileInfo> FindFiles()
        {
            AddFiles();
            return FindedFiles;
        }
        private void AddFiles()
        {
            try
            {
                foreach (string Extension in Extensions)
                {
                    Files.AddRange(Directory.GetFiles(Extension, System.IO.SearchOption.TopDirectoryOnly));
                }
            }
            catch
            {
                Console.WriteLine(" файлы не берутся из"+Directory);
            }
            try
            {
                foreach (System.IO.DirectoryInfo Subdirectory in Directory.GetDirectories())
                {
                    Directory = Subdirectory;
                    AddFiles();
                }
            }
            catch
            {
                Console.WriteLine(" папки не берутся из" + Directory);
            }
        }        
    }
}



и получаю файлы так

    foreach (System.IO.FileInfo File in new FileSearcher(extensions, Drive.RootDirectory).FindFiles())
    {

пока он прочесал весь диск С, прошло минуты две (задал расширения для поиска exe и pdf) smile  (хотя если не задать расширение то он прочесал мои диск C и D за 14,5 сек...)

видимо придется этот занос файлов в список делать в одном потоке а юзать сами файлы в другом, параллельном ему потоке..
тоесть там надо делать событие ФайлДобавлен и обрабатывать его в другом потоке... но это уже другая тема

Это сообщение отредактировал(а) Kvazilol - 19.4.2007, 21:59
PM MAIL   Вверх
mr.DUDA
Дата 19.4.2007, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Kvazilol, так ведь любая прога (например Total Commander или Far) практически столько же времени потратит на рекурсивный обход раздела, к примеру если поиск по маске выполнить или дерево папок построить.


--------------------
user posted image
PM MAIL WWW   Вверх
Kuznecoff
Дата 9.7.2007, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 4.7.2007

Репутация: нет
Всего: нет



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

Цитата

FileSystemInfo[] infos = dir_info.GetFileSystemInfos(tbFilter.Text);


Если я ввожу какойто один тип файлов (к примеру "*.txt"), то поиск проходит нормально, но что нужно сделать если мне надо найти например такие файлы - "*.cs, *.cpp"??? На такую маску функция к сожалению не реагирует. Подскажите как решить проблему!!!
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0889 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.