Страница: 1 | 2 | 3 | 4 | 5 | 6 |
Вопрос: System.OutOfMemoryException
Добавлено: 02.03.08 20:36
Автор вопроса:
Кирилл | Web-сайт:
Ответы
Всего ответов: 82
Номер ответа: 46
Автор ответа: Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #46
Добавлено: 04.03.08 13:24
Что за детский сад?
Код работы с файловой системой вставить в исходник.
Номер ответа: 47
Автор ответа: Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #47
Добавлено: 04.03.08 13:28
Свою мега-библиотеку где-нибудь выложи, я здесь свой E-mail светить не намерен.
Ты разумеется понял что мне нужен исходный код библиотеки а не сама dll.
Номер ответа: 48
Автор ответа: fluke
ICQ: 318170731
Вопросов: 15
Ответов: 96
Профиль | | #48
Добавлено: 04.03.08 14:04
линк на библиотеку clsReadFiles.dll http://slil.ru/25543583
Номер ответа: 49
Автор ответа: Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #49
Добавлено: 04.03.08 18:32
Выложи исходный код библиотеки, без него ни один человек на форуме твою библиотеку даже качать не будет.
Далее можно будет продолжить разговор.
Это вопрос не принципа как ты говоришь, а вопрос банального дол****ства - запускать неизвестные неподписанные бинарики скачаные с каких-то помоек.
Номер ответа: 50
Автор ответа: fluke
ICQ: 318170731
Вопросов: 15
Ответов: 96
Профиль | | #50
Добавлено: 04.03.08 18:48
не один человек на форуме не называет чужой код г****м, только по тому, что алгоритм расходиться с его личными убеждениями. я тебе предлагал, лично, выслать библиотеку. верить на слово, я бы тоже не стал. если не веришь моей порядочности, можешь написать сам, используя api, если конечно сможешь
)))) уверяю тебя, результат тебя порадует, ну по крайней мере научишься пользоваться иными функциями
Номер ответа: 51
Автор ответа: Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #51
Добавлено: 04.03.08 19:05
Я не называл твой код г***м потому что твой алгоритм расходится с моими личными убеждениями.
Я назвал твой код г***м потому что твой код и есть г***но и я не одинок в этой позиции.
Повторяю еще раз, меня не интерисует библиотека, меня интерисует К О Д.
))))
Сходу не смогу тем более что я за последние 3 года не использовал ничего кроме FCL
Чем порадует?
Я прекрасно осознаю какой результат получу и ничего радостного я здесь не вижу.
Повторюсь, за последние 3 года я не использовал ничего кроме FCL. Втечение следующих 5 лет ничего другого использовать не планирую. Смысла учиться тому что мне не понадобится не вижу, я все-таки человек который ценит свое время (а не только трубит об этом на углу)
Номер ответа: 52
Автор ответа: Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #52
Добавлено: 04.03.08 19:33
Кстати, fluke, начинаешь заговариваться!
ВОТ ОН Я ЖЕЛАЮЩИЙ!!!! Почему мне не был предоставлен исходник?
Или там походу такая лажа что показывать стыдно народу?
Номер ответа: 53
Автор ответа: fluke
ICQ: 318170731
Вопросов: 15
Ответов: 96
Профиль | | #53
Добавлено: 05.03.08 10:13
чувак, я так понял что для тебя скорость критична. использование API дает двойной прирост производительности. а ты говоришь, все это лажа. вместо 10 минут, твой код будет работать 20 минут. ты просто не знаешь, как это делать и пытаешься съехать!
Вот оно поколение программистов, взращенное на обертках
Номер ответа: 54
Автор ответа: fluke
ICQ: 318170731
Вопросов: 15
Ответов: 96
Профиль | | #54
Добавлено: 05.03.08 10:20
уморил вот тебе пример статьи на VB6.0
Рекурсивный поиск файлов и папок
(обращений: 8891 )
В этой статье описывается минимальный код для поиска файлов и папок с использованием API функций FindFirstFile, FindNextFile и FindClose. Данный пример поиска довольно прост, он позволяет задать только одиночный запрос: "*.*" или "*", запрос с несколькими файлами не даст результатов: "*.bmp,*.gif". Его принцип таков:
Ищем все подкаталоги в папке, в которой был указан поиск.
В каждом найденном подкаталоге ищем файлы, указанные для поиска.
Для реализации принципа, во - первых, нам потребуется создать функцию поиска папок:
Private Sub SearchForFolders(fName As String, Path As String, File As String) 'fName - указывает, какие подкаталоги будем искать("*" - все подкаталоги, как и в нашем случае); Path - указывает, в какой папке будем искать; File - указывает, какой файл будем искать.
If StopSearch = True Then Exit Sub 'переменная StopSearch указывает, должен ли быть прерван поиск.
Dim Atr As Integer
Dim hFnd As Long
Dim WFD As WIN32_FIND_DATA
hFnd = FindFirstFile(Path & fName, WFD) 'ищем первый подкаталог.
If hFnd = INVALID_HANDLE_VALUE Then Exit Sub 'если подкаталог не найден, то выходим из функции.
SearchForFiles File, Path 'вызывает ещё одну фнкцию для поиска файлов в папке.
Do
Atr = (WFD.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY) 'узнаём, является ли найденный файл папкой
If TrimNull(WFD.cFileName) <> "." And TrimNull(WFD.cFileName) <> ".." Then 'если папка не является корневой на диске, то функция FindNextFile возвращает эти два значения.
If Atr > 0 Then
DoEvents
SearchForFolders fName, Path & TrimNull(WFD.cFileName) & "\", File 'Если файл является папкой, то снова вызываем функцию поиска подкаталогов в этой папке.
End If
End If
Loop While FindNextFile(hFnd, WFD) 'производим поиск до конца.
FindClose hFnd 'освобождаем память.
End Sub
Думаю, что всем понятен принцип этой функции: производится поиск всех папок, для каждой папки производится поиск подкаталогов и так далее, пока не будут найдены все папки - в этом и заключается рекурсия. Одновременно с поиском папок в них производится поиск указанного файла. Функция для поиска файлов почти аналогична функции поиска папок:
Private Sub SearchForFiles(fName As String, Path As String) 'Path - указывает в какой папке будет производится поиск фалов, указанных в параметре fName.
If StopSearch = True Then Exit Sub
Dim Atr As Integer
Dim hFnd As Long
Dim WFD As WIN32_FIND_DATA
hFnd = FindFirstFile(Path & fName, WFD) 'ищем первый файл.
If hFnd = INVALID_HANDLE_VALUE Then Exit Sub
Do
Atr = (WFD.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY) 'узнаём, является ли найденный файл папкой
If TrimNull(WFD.cFileName) <> "." And TrimNull(WFD.cFileName) <> ".." Then
If Atr > 0 Then 'если это папка
lstFiles.AddItem "[" & Path & TrimNull(WFD.cFileName) & "]" 'добавляем её в список найденных.
Else 'если это файл
lstFiles.AddItem Path & TrimNull(WFD.cFileName) 'добавляем его в список найденных.
End If
End If
Loop While FindNextFile(hFnd, WFD)
FindClose hFnd
End Sub
Теперь пробуем поиск - вызываем функцию SearchForFolders:
SearchForFolders ( "*.*", "c:\windows\", "*.txt"
"*" - ищем во всех подкаталогах папки "c:\windows\" файлы с именем "*.txt".
Скачать прмер RecursiveSearch
разбирайся и учись кодить на более низком уровне
Номер ответа: 55
Автор ответа: Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #55
Добавлено: 05.03.08 12:01
Как правило - да.
Я этого не говорил.
Это верно.
Вместо 10 минут "некий идеальный код который пока видел только один человек и который запускался только на одной единственной машине" мой код, "который я дал всем людям на свободное обозрение" будет работь 20 минут (в теории)
Вот оно поколение программистов, взращенное на обертках
Брось
Я использовал Win32API когде еще когда никакого .NET и в планах не было.
Ладно меня достали твои наезды сейчас декомпильну твою мега-библиотеку и сообщу о результатах.
Номер ответа: 56
Автор ответа: fluke
ICQ: 318170731
Вопросов: 15
Ответов: 96
Профиль | | #56
Добавлено: 05.03.08 12:10
"Я использовал Win32API когде еще когда никакого .NET и в планах не было." это когда? когда ты еще в школе был
))))))
Номер ответа: 57
Автор ответа: Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #57
Добавлено: 05.03.08 12:36
да, именно когда был в школе
Номер ответа: 58
Автор ответа: Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #58
Добавлено: 05.03.08 12:41
Public Class ReadFiles
' Methods
<llImport("kernel32", CharSet:=CharSet.Ansi, SetLastError:=True, ExactSpelling:=True)> _
Private Shared Function FindClose(ByVal hFindFile As Integer) As Long
End Function
<llImport("kernel32", EntryPoint:="FindFirstFileA", CharSet:=CharSet.Ansi, SetLastError:=True, ExactSpelling:=True)> _
Private Shared Function FindFirstFile(<MarshalAs(UnmanagedType.VBByRefStr)> ByRef lpFileName As String, ByRef lpFindFileData As WIN32_FIND_DATA) As Integer
End Function
<llImport("kernel32", EntryPoint:="FindNextFileA", CharSet:=CharSet.Ansi, SetLastError:=True, ExactSpelling:=True)> _
Private Shared Function FindNextFile(ByVal hFindFile As Integer, ByRef lpFindFileData As WIN32_FIND_DATA) As Integer
End Function
<llImport("kernel32", EntryPoint:="GetFileAttributesA", CharSet:=CharSet.Ansi, SetLastError:=True, ExactSpelling:=True)> _
Private Shared Function GetFileAttributes(<MarshalAs(UnmanagedType.VBByRefStr)> ByRef lpFileName As String) As Integer
End Function
Public Sub Read(ByVal Path As String)
Me.SearchForFiles(Path)
End Sub
Private Sub SearchForFiles(ByVal Folder As String)
 im lpFindFileData As New WIN32_FIND_DATA
If (Strings.Right(Folder, 1) <> "\" Then
Folder = (Folder & "\"
End If
 im hFindFile As Integer = ReadFiles.FindFirstFile(((Folder & "*.*"
), (lpFindFileData))
If (hFindFile <> -1) Then
 o While (ReadFiles.FindNextFile(hFindFile, (lpFindFileData)) > 0)
 im name As String
If (Strings.InStr(lpFindFileData.Name, ChrW(0), CompareMethod.Binary) > 0) Then
name = Strings.Left(lpFindFileData.Name, (Strings.InStr(lpFindFileData.Name, ChrW(0), CompareMethod.Binary) - 1))
Else
name = lpFindFileData.Name
End If
If Not ((name = "." Or (name = ".."
) Then
If ((lpFindFileData.Attributes And &H10) > 0) Then
Me.SearchForFiles((Folder & name))
Else
Me.Files.Add((Folder & name))
End If
End If
Loop
ReadFiles.FindClose(hFindFile)
End If
End Sub
' Fields
Private Const FILE_ATTRIBUTE_ARCHIVE As Short = &H20
Private Const FILE_ATTRIBUTE_DIRECTORY As Short = &H10
Private Const FILE_ATTRIBUTE_HIDDEN As Short = 2
Private Const FILE_ATTRIBUTE_NORMAL As Short = &H80
Private Const FILE_ATTRIBUTE_READONLY As Short = 1
Private Const FILE_ATTRIBUTE_SYSTEM As Short = 4
Private Const FILE_ATTRIBUTE_TEMPORARY As Short = &H100
Public Files As List(Of String) = New List(Of String)
Private Const INVALID_HANDLE_VALUE As Short = -1
Private Const MAX_PATH As Short = 260
Private Const MAXDWORD As Short = -1
' Nested Types
<StructLayout(LayoutKind.Sequential)> _
Private Structure FILETIME
Public dwLowDateTime As Integer
Public dwHighDateTime As Integer
End Structure
<StructLayout(LayoutKind.Sequential)> _
Private Structure WIN32_FIND_DATA
Public Attributes As Integer
Public CreationTime As FILETIME
Public LastAccessTime As FILETIME
Public LastWriteTime As FILETIME
Public SizeHigh As Integer
Public SizeLow As Integer
Public Reserved0 As Integer
Public Reserved1 As Integer
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=260)> _
Public Name As String
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=14)> _
Public Alternate As String
End Structure
End Class
этот код? Если нет, то не обижайся.
> EntryPoint:="FindFirstFileA", CharSet:=CharSet.Ansi
> EntryPoint:="FindNextFileA", CharSet:=CharSet.Ansi
> EntryPoint:="GetFileAttributesA", CharSet:=CharSet.Ansi
какая сказачная лажа
> Public Files As List(Of String) = New List(Of String)
Использование переменной уровня класса необосновано. И тем более смешно читать твое "код инкапсулирован чтоб блаблабла..." - я смогу его "завалить" даже без декомпиляции
По поводу наименования переменных почитай эти рекомендации - http://www.gotdotnet.ru/LearnDotNet/NETFramework/594.aspx
Ладно, я не бесплатный ревизор кода, перейдем непосредственно к тестированию.
Код был получен с помощью программы Reflector, был вставлен в тестовый проект.
Прогонял каждый кусок кода до тех пор пока вся ФС не закешируется (время доводил до минимального).
Программы собирались в режиме Relese.
Windows Server 2008 Enterprise x64, диск 400ГБ, 3 раздела.
Steel Brand:
Dim Files = LoadAllFiles()
Console.WriteLine(Now.Subtract(start))
Console.WriteLine("Найдено файлов: {0}", Files.Count)
Console.ReadLine()
Result:
Найдено файлов: 312712
Результат.. не то чтоб непредсказуемый, аналогичный я получал на прошлых тестах.
Гуд, попробуем запустить твой код.
Поскольку твой код не способен сам перебирать буквы дисков, делаем несколько вызовов для каждого диска. Если где-то я написал неверные вызовы - укажи.
Dim ReadFiles As New ReadFiles
For Each Drive In DriveInfo.GetDrives
If Drive.DriveType = DriveType.Fixed Then
ReadFiles.Read(Drive.RootDirectory.FullName)
End If
Next
Dim Files = ReadFiles.Files
Console.WriteLine(Now.Subtract(start))
Console.WriteLine("Найдено файлов: {0}", Files.Count)
Console.ReadLine()
Result:
Найдено файлов: 110
Скажем так, я ожидал что твой код будет выполняться гораздо бОльше времени чем показали реальные тесты.
К сожалению программа нашла не все файлы которые есть на моем компьютере поэтому сравнение времени выполнения делать необъективно.
Более объективным будет сравнение скорости работы в рассчете на единицу времени.
Steel Brand: 36185 файлов/сек
fluke: 12222 файлов/сек
то есть - в рассчете на единицу времени твой код находит в 3 раза меньше файлов чем мой.
Никакой инстурмент, даже самый быстрый, не дает право программисту писать откровенную ЛАЖУ.
За сим считаю вопрос решенным.
Номер ответа: 59
Автор ответа: Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #59
Добавлено: 05.03.08 12:52
Кстати еще более интересно сравнить не время работы и не количество результатов а сами результаты.
Мой код находит:
C:\autoexec.bat
C:\bootmgr
C:\BOOTSECT.BAK
C:\config.sys
C:\inVHDDrvLog.dat
C:\IO.SYS
C:\msdia80.dll
C:\MSDOS.SYS
C:\pagefile.sys
C:\~$2.txt
C:\~$akarov.txt
C:\$Recycle.Bin\S-1-5-21-1613133395-4278240515-1316546919-500\$IRXVXXH.xlsb
C:\$Recycle.Bin\S-1-5-21-1613133395-4278240515-1316546919-500\$RRXVXXH.xlsb
C:\$Recycle.Bin\S-1-5-21-1613133395-4278240515-1316546919-500\desktop.ini
C:\$Recycle.Bin\S-1-5-21-2088595665-3436651255-2992290667-500\desktop.ini
C:\ATI\SUPPORT\8-2_vista64_dd_ccc_wdm_enu_58134\Driver\mfc80u.dll
C:\ATI\SUPPORT\8-2_vista64_dd_ccc_wdm_enu_58134\Driver\Microsoft.VC80.ATL.manife
st
C:\ATI\SUPPORT\8-2_vista64_dd_ccc_wdm_enu_58134\Driver\Microsoft.VC80.CRT.manife
st
C:\ATI\SUPPORT\8-2_vista64_dd_ccc_wdm_enu_58134\Driver\Microsoft.VC80.MFC.manife
st
..............
и тпт
Твой код находит:
C:\
C:\
C:\
C:\
C:\
C:\
C:\
C:\
C:\
C:\
C:\
C:\
C:\
C:\
C:\
C:\
C:\
C:\
C:\
C:\
C:\
C:\
C:\
C:\
C:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
D:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
E:\
Не могу больше писать так как валяюсь под столом!
Номер ответа: 60
Автор ответа: Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #60
Добавлено: 05.03.08 12:52
Забавненько.
Про именование переменных - с Brand'ом согласен. Меня тоже корёжить
начало, когда я увидел такие имена