Страница: 1 | 2 |
Вопрос: количество файлов в папке
Добавлено: 04.08.04 14:35
Автор вопроса: cresta
Всем привет. Что-то давно я ничего не спрашивал, исправляюсь:
Как узнать количество файлов в папке и во всех вложенных папках? Примерно как наступить на папку в проводнике правой мышью и выбрать свойства. И появляется окошко с инфой: Содержит:456 папок, 5883 файла?
Вот такая задача. Только без VB и FSO. Кто-нибудь знает? Только без рекурсии.
Ответы
Всего ответов: 17
Номер ответа: 1
Автор ответа:
dNW
Вопросов: 30
Ответов: 683
Профиль | | #1
Добавлено: 04.08.04 15:40
>Только без VB и FSO.
Что это значит? Может на Delphi?
Номер ответа: 2
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #2
Добавлено: 04.08.04 16:33
FindFirstFile и FindNextFile
Номер ответа: 3
Автор ответа:
M@X
Вопросов: 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/
 im FileName As String ' Walking filename variable...
 im DirName As String ' SubDirectory Name
 im dirNames() As String ' Buffer for directory name entries
 im nDir As Integer ' Number of directories in this path
 im i As Integer ' For-loop counter...
 im hSearch As Long ' Search Handle
 im WFD As WIN32_FIND_DATA
 im Cont As Integer
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
 o While Cont
 irName = StripNulls(WFD.cFileName)
' Ignore the current and encompassing directories.
If (DirName <> "." And (DirName <> ".." Then
' Check for directory with bitwise comparison.
If GetFileAttributes(path & DirName) And FILE_ATTRIBUTE_DIRECTORY Then
dirNames(nDir) = DirName
 irCount = DirCount + 1
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 <> "." And (FileName <> ".." Then
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()
 im SearchPath As String, FindStr As String
 im FileSize As Long
 im NumFiles As Integer, NumDirs As Integer
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" & " Bytes"
Screen.MousePointer = vbDefault
End Sub
Номер ответа: 4
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #4
Добавлено: 04.08.04 17:56
Народ, вы чего? Рекурсию и поиск файлов я давно сделал, работает, мне надо перед началом рекурсивного поиска определиться, к чему привязать прогрессбар, который будет ползти в процессе рекурсии. Хотел привязать к количеству файлов в папке и вложенных папках (это - максимум прогрессбара, текущее положение - количество найденных при помощи FindNextFile) Такая схема. Может есть какая API? Должна быть, ведь в свойствах папки отображается как-то количество файлов и вложенных папок. Хоть на Delphi, хоть на чём, лишь бы сводилось к API. Или к ф-ции на уровне прерываний.
Номер ответа: 5
Автор ответа:
dNW
Вопросов: 30
Ответов: 683
Профиль | | #5
Добавлено: 04.08.04 18:16
насчет дельфи я пошутил...
Номер ответа: 6
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #6
Добавлено: 05.08.04 01:17
А ты где-нибудь в поиске видел прогрессбар? :O
Номер ответа: 7
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #7
Добавлено: 05.08.04 07:17
Обязятельно надо видеть?
Номер ответа: 8
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #8
Добавлено: 05.08.04 11:12
Нет, просто если бы это было, то действительно было бы решение данного вопроса... а так...
Номер ответа: 9
Автор ответа:
boevik
Хранитель чата
ICQ: 137392264
Вопросов: 8
Ответов: 557
Web-сайт:
Профиль | | #9
Добавлено: 05.08.04 11:43
Так сделай рекурсию только для подсчета кол-ва файлов.
Даже с рекурсией и FSO это работает очень быстро
Номер ответа: 10
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #10
Добавлено: 05.08.04 15:25
2boevik, примного сомневаюсь что creasta покусится на какой-то жалкий FSO
А вообще же, пока узнаем кол-во файлов, ведь попутно узнаем и путь к файлам, да и другие параметры...
Вот тут сейчас посмотрел, действительно, Explorer, это делает ой как шустро...
Номер ответа: 11
Автор ответа:
boevik
Хранитель чата
ICQ: 137392264
Вопросов: 8
Ответов: 557
Web-сайт:
Профиль | | #11
Добавлено: 05.08.04 15:42
sne, почему сразу жалкий.
FSO выдает кол-во файлов в дириктории в качестве property, поэтому не надо никакий циклов в самой функции.
Кстати нарисивал я эту функцию, считает кол-во файлов не медленее, чем explorer и TC.
Номер ответа: 12
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #12
Добавлено: 06.08.04 04:09
boevik
Да не пойдет FSO. По двум причинам: 1.Программа на ассемблере, а FSO я даже на VB обходил стороной. 2.Вся прога весит 38 кб (из ни сам поиск - ок.4 кб, а для добавления одной только фичи увеличивать её на 100 кб минимум - несерьёзно.
А делать предварительную рекурсию для подсчёта - смысла нет. Без потери скорости я определяю заодно и всю инфу о найденных файлах.Так зачем два раза проходить, если с первого уже всё определил.
Пока остановился на счётчике(количество найденных файлов). Просто перерисовываю его в процессе рекурсии один раз на 100 пройденных папок. А так была задумка красивый прогресс нарисовать, но не к чему прилепить
Может в недрах реестра что-нибудь есть по этому поводу?
Номер ответа: 13
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #13
Добавлено: 06.08.04 10:17
а если сделать предварительную рекурсию по каталогом, скажем, вложености 2 или 3... это не займет много времени, но за-то пусть не плавный, но програ\есс-бар тебе обеспечен...
Номер ответа: 14
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #14
Добавлено: 06.08.04 15:09
Пробовал, но коряво выглядит. А если вложенных папок нет, то вообще ничего не выйдет
Номер ответа: 15
Автор ответа:
avkiev
ICQ: 226072
Вопросов: 48
Ответов: 107
Профиль | | #15
Добавлено: 05.10.04 19:36
2 cresta
Ниче не придумал по этой проблеме ?