Вопрос: количество файлов в папке | Добавлено: 04.08.04 14:35 |
Автор вопроса: ![]() |
Всем привет. Что-то давно я ничего не спрашивал, исправляюсь:
Как узнать количество файлов в папке и во всех вложенных папках? Примерно как наступить на папку в проводнике правой мышью и выбрать свойства. И появляется окошко с инфой: Содержит:456 папок, 5883 файла? Вот такая задача. Только без VB и FSO. Кто-нибудь знает? Только без рекурсии. |
Ответы | Всего ответов: 17 |
Номер ответа: 1 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 30 Ответов: 683 |
Профиль | Цитата | #1 | Добавлено: 04.08.04 15:40 |
>Только без VB и FSO.
Что это значит? Может на Delphi? |
Номер ответа: 2 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 204447456 Вопросов: 180 Ответов: 4229 |
Web-сайт: Профиль | Цитата | #2 | Добавлено: 04.08.04 16:33 |
FindFirstFile и FindNextFile |
Номер ответа: 3 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 38 Ответов: 43 |
Профиль | Цитата | #3 | Добавлено: 04.08.04 16:46 |
'Create a form with a command button (command1), a list box (list1)
'and four text boxes (text1, text2, text3 and text4). 'Type in the first textbox a startingpath like c:\ 'and in the second textbox you put a pattern like *.* or *.txt Private Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long Private Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA" (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long Private Declare Function GetFileAttributes Lib "kernel32" Alias "GetFileAttributesA" (ByVal lpFileName As String) As Long Private Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) As Long Const MAX_PATH = 260 Const MAXDWORD = &HFFFF Const INVALID_HANDLE_VALUE = -1 Const FILE_ATTRIBUTE_ARCHIVE = &H20 Const FILE_ATTRIBUTE_DIRECTORY = &H10 Const FILE_ATTRIBUTE_HIDDEN = &H2 Const FILE_ATTRIBUTE_NORMAL = &H80 Const FILE_ATTRIBUTE_READONLY = &H1 Const FILE_ATTRIBUTE_SYSTEM = &H4 Const FILE_ATTRIBUTE_TEMPORARY = &H100 Private Type FILETIME dwLowDateTime As Long dwHighDateTime As Long End Type Private Type WIN32_FIND_DATA dwFileAttributes As Long ftCreationTime As FILETIME ftLastAccessTime As FILETIME ftLastWriteTime As FILETIME nFileSizeHigh As Long nFileSizeLow As Long dwReserved0 As Long dwReserved1 As Long cFileName As String * MAX_PATH cAlternate As String * 14 End Type Function StripNulls(OriginalStr As String) As String If (InStr(OriginalStr, Chr(0)) > 0) Then OriginalStr = Left(OriginalStr, InStr(OriginalStr, Chr(0)) - 1) End If StripNulls = OriginalStr End Function Function FindFilesAPI(path As String, SearchStr As String, FileCount As Integer, DirCount As Integer) 'KPD-Team 1999 'E-Mail: KPDTeam@Allapi.net 'URL: http://www.allapi.net/ ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() If Right(path, 1) <> "\" Then path = path & "\" ' Search for subdirectories. nDir = 0 ReDim dirNames(nDir) Cont = True hSearch = FindFirstFile(path & "*", WFD) If hSearch <> INVALID_HANDLE_VALUE Then ![]() ![]() ' Ignore the current and encompassing directories. If (DirName <> "." ![]() ![]() ' Check for directory with bitwise comparison. If GetFileAttributes(path & DirName) And FILE_ATTRIBUTE_DIRECTORY Then dirNames(nDir) = DirName ![]() nDir = nDir + 1 ReDim Preserve dirNames(nDir) End If End If Cont = FindNextFile(hSearch, WFD) 'Get next subdirectory. Loop Cont = FindClose(hSearch) End If ' Walk through this directory and sum file sizes. hSearch = FindFirstFile(path & SearchStr, WFD) Cont = True If hSearch <> INVALID_HANDLE_VALUE Then While Cont FileName = StripNulls(WFD.cFileName) If (FileName <> "." ![]() ![]() FindFilesAPI = FindFilesAPI + (WFD.nFileSizeHigh * MAXDWORD) + WFD.nFileSizeLow FileCount = FileCount + 1 List1.AddItem path & FileName End If Cont = FindNextFile(hSearch, WFD) ' Get next file Wend Cont = FindClose(hSearch) End If ' If there are sub-directories... If nDir > 0 Then ' Recursively walk into them... For i = 0 To nDir - 1 FindFilesAPI = FindFilesAPI + FindFilesAPI(path & dirNames(i) & "\", SearchStr, FileCount, DirCount) Next i End If End Function Sub Command1_Click() ![]() ![]() ![]() Screen.MousePointer = vbHourglass List1.Clear SearchPath = Text1.Text FindStr = Text2.Text FileSize = FindFilesAPI(SearchPath, FindStr, NumFiles, NumDirs) Text3.Text = NumFiles & " Files found in " & NumDirs + 1 & " Directories" Text4.Text = "Size of files found under " & SearchPath & " = " & Format(FileSize, "#,###,###,##0" ![]() Screen.MousePointer = vbDefault End Sub |
Номер ответа: 4 Автор ответа: ![]() ![]() ![]() Вопросов: 117 Ответов: 1538 |
Профиль | Цитата | #4 | Добавлено: 04.08.04 17:56 |
Народ, вы чего? ![]() |
Номер ответа: 5 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 30 Ответов: 683 |
Профиль | Цитата | #5 | Добавлено: 04.08.04 18:16 |
насчет дельфи я пошутил... |
Номер ответа: 6 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Лидер форума ICQ: 216865379 Вопросов: 106 Ответов: 9979 |
Web-сайт: Профиль | Цитата | #6 | Добавлено: 05.08.04 01:17 |
А ты где-нибудь в поиске видел прогрессбар? :O |
Номер ответа: 7 Автор ответа: ![]() ![]() ![]() Вопросов: 117 Ответов: 1538 |
Профиль | Цитата | #7 | Добавлено: 05.08.04 07:17 |
Обязятельно надо видеть? |
Номер ответа: 8 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 233286456 Вопросов: 34 Ответов: 5445 |
Web-сайт: Профиль | Цитата | #8 | Добавлено: 05.08.04 11:12 |
Нет, просто если бы это было, то действительно было бы решение данного вопроса... а так... |
Номер ответа: 9 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() Хранитель чата ICQ: 137392264 Вопросов: 8 Ответов: 557 |
Web-сайт: Профиль | Цитата | #9 | Добавлено: 05.08.04 11:43 |
Так сделай рекурсию только для подсчета кол-ва файлов.
Даже с рекурсией и FSO это работает очень быстро |
Номер ответа: 10 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 233286456 Вопросов: 34 Ответов: 5445 |
Web-сайт: Профиль | Цитата | #10 | Добавлено: 05.08.04 15:25 |
2boevik, примного сомневаюсь что creasta покусится на какой-то жалкий FSO ![]() А вообще же, пока узнаем кол-во файлов, ведь попутно узнаем и путь к файлам, да и другие параметры... Вот тут сейчас посмотрел, действительно, Explorer, это делает ой как шустро... |
Номер ответа: 11 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() Хранитель чата ICQ: 137392264 Вопросов: 8 Ответов: 557 |
Web-сайт: Профиль | Цитата | #11 | Добавлено: 05.08.04 15:42 |
sne, почему сразу жалкий.
FSO выдает кол-во файлов в дириктории в качестве property, поэтому не надо никакий циклов в самой функции. Кстати нарисивал я эту функцию, считает кол-во файлов не медленее, чем explorer и TC. |
Номер ответа: 12 Автор ответа: ![]() ![]() ![]() Вопросов: 117 Ответов: 1538 |
Профиль | Цитата | #12 | Добавлено: 06.08.04 04:09 |
boevik
Да не пойдет FSO. По двум причинам: 1.Программа на ассемблере, а FSO я даже на VB обходил стороной. 2.Вся прога весит 38 кб (из ни сам поиск - ок.4 кб, а для добавления одной только фичи увеличивать её на 100 кб минимум - несерьёзно. А делать предварительную рекурсию для подсчёта - смысла нет. Без потери скорости я определяю заодно и всю инфу о найденных файлах.Так зачем два раза проходить, если с первого уже всё определил. Пока остановился на счётчике(количество найденных файлов). Просто перерисовываю его в процессе рекурсии один раз на 100 пройденных папок. А так была задумка красивый прогресс нарисовать, но не к чему прилепить ![]() Может в недрах реестра что-нибудь есть по этому поводу? |
Номер ответа: 13 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 233286456 Вопросов: 34 Ответов: 5445 |
Web-сайт: Профиль | Цитата | #13 | Добавлено: 06.08.04 10:17 |
а если сделать предварительную рекурсию по каталогом, скажем, вложености 2 или 3... это не займет много времени, но за-то пусть не плавный, но програ\есс-бар тебе обеспечен... |
Номер ответа: 14 Автор ответа: ![]() ![]() ![]() Вопросов: 117 Ответов: 1538 |
Профиль | Цитата | #14 | Добавлено: 06.08.04 15:09 |
Пробовал, но коряво выглядит. А если вложенных папок нет, то вообще ничего не выйдет |
Номер ответа: 15 Автор ответа: ![]() ![]() ICQ: 226072 Вопросов: 48 Ответов: 107 |
Профиль | Цитата | #15 | Добавлено: 05.10.04 19:36 |
2 cresta
Ниче не придумал по этой проблеме ? |
|