Страница: 1 | 2 |
Вопрос: Как упорядочить файлы в System.IO.FileSystemInfo
Добавлено: 09.05.06 16:40
Автор вопроса: dr.Faust
Вот такой код:
Dim di As System.IO.DirectoryInfo
Dim fsi() As System.IO.FileSystemInfo
di = New System.IO.DirectoryInfo(Dir)
fsi = di.GetFileSystemInfos(TextBox_Mask.Text)
Вопрос:
В каком, таком диком порядке fsi получает файлы?
Как упорядочить их по алфавиту?
fsi.Sort() не работает , требует аргумент. Что ей надо?
Array.Sort(fsi) так тоже не работает.
Помогите примером, плиз.
Ответы
Всего ответов: 21
Номер ответа: 1
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #1
Добавлено: 09.05.06 17:30
не ну сцуки вы нетчики )) хоть что-то руками делать будите? массив уже упорядочить забыли как без дотнета ))
Номер ответа: 2
Автор ответа:
dr.Faust
Вопросов: 6
Ответов: 26
Профиль | | #2
Добавлено: 09.05.06 17:34
Если б мне надо было просто упорядочить массив...
И не была бы нужна кроссплатформенность PC/PDA...
И че ругаешься, то, не знаешь - не отвечай - не парься.
Номер ответа: 3
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #3
Добавлено: 09.05.06 17:36
та ну я ж любя ты не обижайся...
Номер ответа: 4
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #4
Добавлено: 09.05.06 23:26
HACKER, руками.. это ты сам парься!
А нам не пристало такой фигней заниматься!!!
Номер ответа: 5
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #5
Добавлено: 10.05.06 01:50
dr.Faust
Фишка в том,что .NET не знает как тебе сортировать объекты типа FileSystemInfo по размеру файлов, аттрибутам, именам файлов и т.д. Он может сортировать только простые элементы... строка, число, дата т.д.. А вот чтобы сортировать обекты, ты должен создать класс реализующий интерфейс IComparer в котором надо переопределить функцию Compare чтобы .NET знал как сравнивнить 2 объекта заданного типа. Как это можно сделать я показал на примере:
Public Class Form1
Private fileSysInfos() As FileSystemInfo
Private Sub btnSort_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSort.Click
If fileSysInfos Is Nothing OrElse fileSysInfos.Length = 0 Then Return
Array.Sort(fileSysInfos, New FileSystemInfoComparer)
ShowArrayItems()
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim seachDirectory As String = "C:\WINDOWS"
Dim dirInfo As New DirectoryInfo(seachDirectory)
fileSysInfos = dirInfo.GetFileSystemInfos("*.exe"
ShowArrayItems()
End Sub
Private Sub ShowArrayItems()
'Выводим элементы массива в ListBox1
ListBox1.Items.Clear()
For Each fileSysInfo As FileSystemInfo In fileSysInfos
ListBox1.Items.Add(fileSysInfo.Name)
Next
End Sub
End Class
Public Class FileSystemInfoComparer
Implements IComparer
Function Compare(ByVal x As Object, ByVal y As Object) As Integer _
Implements IComparer.Compare
'Для наглядности я реализовал сортировку ТОЛЬКО по именам
'при желании можно организовать более сложный алгоритм
'сортировки(по размерам файла,датам создания,аттрибутам и т.д..)
If x Is Nothing OrElse y Is Nothing Then Throw New ArgumentNullException
Dim fullPath1 As String = String.Empty
Dim fullPath2 As String = String.Empty
Try
fullPath1 = CType(x, FileSystemInfo).Name
fullPath2 = CType(y, FileSystemInfo).Name
Catch ex As Exception
Throw New ArgumentException("Object of comparer is not FileSystemInfo"
End Try
Return String.Compare(fullPath1, fullPath2)
End Function
End Class
Номер ответа: 6
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #6
Добавлено: 10.05.06 02:36
А вообще.. если делать по уму, то для твоей цели есть более подходящее решение, а именно System.Collections.SortedList.Твой случай сортировки-тривиален, поэтому все,что тебе надо сделать так это загнать твой массив в эту коллекцию и вытащить оттуда уже отсортированный по ключу массив. А IComparer целесообразней использовать в более сложных случаях, когда требуется сортировка по нескольким параметрам..
Вот второе решение твоей проблемы:
Public Class Form1
Private fileSysInfos() As FileSystemInfo
Private Sub btnSort_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSort.Click
If fileSysInfos Is Nothing OrElse fileSysInfos.Length = 0 Then Return
'Загоняем массив в коллекцию
Dim SortedList As New System.Collections.SortedList
For Each fileSysInfo As FileSystemInfo In fileSysInfos
SortedList.Add(fileSysInfo.Name, fileSysInfo)
Next
'Возвращаем в исходный массив
SortedList.Values.CopyTo(fileSysInfos, 0)
'Отображаем результат
ShowArrayItems()
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim seachDirectory As String = "C:\WINDOWS"
Dim dirInfo As New DirectoryInfo(seachDirectory)
fileSysInfos = dirInfo.GetFileSystemInfos("*.exe"
ShowArrayItems()
End Sub
Private Sub ShowArrayItems()
'Выводим элементы массива в ListBox1
ListBox1.Items.Clear()
For Each fileSysInfo As FileSystemInfo In fileSysInfos
ListBox1.Items.Add(fileSysInfo.Name)
Next
End Sub
End Class
Номер ответа: 7
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #7
Добавлено: 10.05.06 02:52
Только тут есть одни грабли, на которые можешь наступить.. Ключ-он должен быть уникален. Поскольку в 1 директории не может быть 2 файлов с одинаковыми именами то я использовал в качестве ключа имя файла, а следовательно не следует использовать этот способ для сортировки имен файлов из нескольких папок, так как есть риск того, что там окажуться 2 файла с одинаковыми именами. В этом случае ты получишь исключение..
Номер ответа: 8
Автор ответа:
я забыл падписацца, асёл
Вопросов: 0
Ответов: 8
Профиль | | #8
Добавлено: 10.05.06 03:43
если сортировать системными средствами нах, то будет именно сортИровка, а если так, как делают нармальные рибята, такие как Хакер нах, то бодет хорошая сортирОвка нах. в жопу все системные средства хе хе
Номер ответа: 9
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #9
Добавлено: 10.05.06 11:13
Хакер нах...
так то нАрмальные рИбята.. где уж нам до них..
круто.. солидно.. а самое главное-умно и достойно!
Номер ответа: 10
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #10
Добавлено: 10.05.06 16:03
ну я ж гаварю
то блин в лист грузим потом там переславляем, то коллекцию создаём ))) а в нете подобных полезностей то много ) потом диск переворачиваешь... рульная игра... новые версии которой штампуются как новые формы унитазов... т.е. в день можно выпустить хоть 3 версии игры )) а шо? :/ дотнет то быстра платформа доя разработки... вернёмся к обратной стороне диска
Системные требования:
P-3.0 Ram 1024, Rom 256... :/
так это я до рекомендуемых не дошёл...
я неговорю что если дотнет так куча ресурсов, с умом и на нём можно делать по нормальному... НО! Крутые то программисты которые научились запускать VS2005... теперь все хавайтесь... ))
Номер ответа: 11
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #11
Добавлено: 10.05.06 22:13
хм.. а где ты видел,чтоб в лист грузили и там перставляли?? чего ты снова ахинею несешь?
И вообще,я не понимаю,чего ты добиваешься? Ведь ты сам в .NET полный ZERO! Как ты можешь судить о том, чего в принципе не понимаешь и никогда не работал!? Спрашивается, чего ради гадить на NET - форуме? Если б что по делу говорил-другой вопрос, а так ... -пустая трата времени.. и своего и чужого..((( Польза от подобных постов-нулевая..
И что такого в том, чтобы использовать специально предназначенную коллекцию? Если есть специализированные средства для сортировки, нафига мне надо руками это все делать? Всякими там "пузырьками" и подобными алгоритмами переставлять элементы массива ) Как вспомню это убожество из VB6 до сих пор смех разбирает!!
Номер ответа: 12
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #12
Добавлено: 10.05.06 23:12
нет, VS .NET я уж запущу как-то, значит не зеро
про трату чужого времени - виноват. извиняюсь.
Номер ответа: 13
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #13
Добавлено: 11.05.06 03:51
А значит можешь уже отнести себя к числу крутых программеров, которые научились запускать VS2005 :-0)
А вот за это-респект! Всегда уважал людей,способных достойно признать ошибки.
А если серьезно.. Руслан, ты уж тоже извини что так на тебе отвязался, я не со зла.. просто знаешь,на самом деле порой обидно выслушивать необоснованные нападки. Да, признаю, в NET тоже есть недостатки.. ресурсы, скорость и т.д.. а какой язык или технология не имеет своих недостатков? Но все это ничтожно мало по сравнению с теми возможностями в разработке,что он предоставляет.. А за удобства всегда надо чем то платить. Да, согласен, ты добился определенного уровня знаний в VB6.. и чем больше ты знаешь, тем болезненнее будет для тебя проходить освоение .NET . Потому что 80% твоих знаний тут окажутся не востребованными. Скажу честно, мое первое впечатление от НЕТ..был шок. Шок от всего этого нового и не понятного.. и прошел далеко не один месяц и не одна бессонная ночь, прежде чем до меня начало доходить то, чего я был лишен в VB6. Я это все к тому, что я уже прошел через это, а тебе это только предстоит. А в том,что переход на НЕТ неизбежен я не сомневаюсь..это лишь вопрос времени(имхо).. Даже со всеми её минусами .NET - это,на мой взгляд, действительно толковая технология, способная решить 90% задач.. (10% оставляю на драйвера,трояны и прочие узкоспециализированные задачи) ))) Так что,впреть, давай не будем устраивать дебаты на тему: "А чо круче???".. время само все расставит на свои места..
Номер ответа: 14
Автор ответа:
Morpheus
Вопросов: 224
Ответов: 3777
Web-сайт:
Профиль | | #14
Добавлено: 11.05.06 04:27
HACKER он хоть и нАрмальный, но но один маленький недостаточеик есть: OCX не любит (вот какой нихарошый) хехе шутка
Номер ответа: 15
Автор ответа:
dr.Faust
Вопросов: 6
Ответов: 26
Профиль | | #15
Добавлено: 11.05.06 08:29
2 EROS
Спасибо, счас буду разбираться. Вообще толково разъяснил.
Про .NET
Да, чего вы приципились, каждый пишет на чем хочет. Я кроме VB.NET вообще ни чего не знаю, может и изучил бы, но я не профи - пишу только если не могу найти какую либо прогу, те по необходимости и только для себя. Вообще это мое 3-е приложение на VB.NET и 4-е с '95-го(!) года. Представте какого оно, когда я только полгода назад узнал, что такое объектно орентированое програмирование.