Страница 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 на верхнем уровне
извиняюсь за рекурсию (так короче получается) :)