Страница 1 из 1
поиск файла
Добавлено: 12 авг 2011, 08:12
Роман01
Я знаю само название файла, а путь к нему не знаю. Как программно найти все файлы с таким именем и расширением, чтобы можно было с ними работать? Например, для функции FileExists() нужен полный путь, а я его не знаю.
Подскажите, пожалуйста.
Re: поиск файла
Добавлено: 12 авг 2011, 11:46
Алекс
1. На каком языке (на С++ кусок более-менее подходящего текста могу прислать)?
2. Где искать (есть по крайне мере конкретная папка или хотя бы диск)?
В общем случае - перебрать все файлы на диске, отделить от полного пути имя файла и сравнить с исходным.
Re: поиск файла
Добавлено: 12 авг 2011, 11:59
Роман01
Хотелось бы на MapBasic.
Желательно на всех дисках, но хотя бы на С:
А как это организовать на MapBasic?
Re: поиск файла
Добавлено: 12 авг 2011, 14:21
Voltron
Смотрите в сторону рекурсивного обхода каталогов. Я хз есть ли в MapBasic возможность работы с файловой системой или нет, но вот вам
код на обычном бейсике. Похожих примеров в гугле навалом.
Re: поиск файла
Добавлено: 12 авг 2011, 14:37
SergS
Алекс писал(а):
В общем случае - перебрать все файлы на диске, отделить от полного пути имя файла и сравнить с исходным.
ну, в общем случае, достаточно перебирать не файлы, а папки, проверяя (тем же fileexists()) наличие нужного файла в каждой.
можно так:
создаем функцию для формирования списка подпапок:
Код: Выделить всё
Define INVALID_HANDLE_VALUE -1
Define MAX_PATH 260
Type FILETIME
dwLowDateTime As Integer
dwHighDateTime As Integer
End Type
Type WIN32_FIND_DATA
dwFileAttributes As Integer
ftCreationTime As FILETIME
ftLastAccessTime As FILETIME
ftLastWriteTime As FILETIME
nFileSizeHigh As Integer
nFileSizeLow As Integer
dwReserved0 As Integer
dwReserved1 As Integer
cFileName As String*MAX_PATH
cAlternateFileName As String*14
End Type
Function GetListFolders(ByVal dir As String, ByVal mask As String,
FileArray() As String) As Integer
Dim count As Integer
Dim fstruct As WIN32_FIND_DATA
Dim res As Integer
Dim dw, fhandle As Integer
Dim fn As String
GetListFolders = 0
If dir = "" Then
Exit Function
End If
If Not FileExists(Left$(dir, Len(dir) - 1)) Then
Exit Function
End If
fstruct.dwFileAttributes = &H00000010
fhandle = FindFirstFile(dir + mask, fstruct)
If fhandle = INVALID_HANDLE_VALUE Then
Exit Function
End If
fn = LTrim$(RTrim$(fstruct.cFileName))
dw = GetFileAttributes(dir + fstruct.cFileName)
If (dw\&H00000010) mod &H00000010 = 1 And fn <> "." And fn <> ".." Then
Redim FileArray(1)
FileArray(1) = fn
count = 1
End If
While FindNextFile(fhandle, fstruct)
fn = LTrim$(RTrim$(fstruct.cFileName))
dw = GetFileAttributes(dir + fn)
If (dw\&H00000010) mod &H00000010 = 1 And fn <> "." And fn <> ".." Then
count = count + 1
Redim FileArray(count)
FileArray(count) = fn
End If
Wend
res = FindClose(fhandle)
GetListFolders = count
End Function
а потом используем ее для обхода всего дерева, например так:
Код: Выделить всё
dim flist() as string
dim fcount as integer
sub ffind(byval adir as string, byval fname as string)
dim dlist() as string
dim i, c as integer
if fileexists(adir+fname) then
fcount = fcount +1
redim flist(fcount)
flist(fcount) = adir + fname
end if
c = GetListFolders(adir, "*.*", dlist)
for i = 1 to c
call ffind(adir + dlist(i) + "\", fname)
next
end sub
результат - глобальный массив полных имен flist() в каталоге ( и всех его подкаталогах), котроый передается в sub на верхнем уровне
извиняюсь за рекурсию (так короче получается)
