поиск файла

Вопросы общего характера по ГИС и дистанционному зондированию, не связанные с конкретным ПО.
Ответить
Роман01
Участник
Сообщения: 66
Зарегистрирован: 03 авг 2010, 04:24
Репутация: 0

поиск файла

Сообщение Роман01 » 12 авг 2011, 08:12

Я знаю само название файла, а путь к нему не знаю. Как программно найти все файлы с таким именем и расширением, чтобы можно было с ними работать? Например, для функции FileExists() нужен полный путь, а я его не знаю.
Подскажите, пожалуйста.

Алекс
Активный участник
Сообщения: 185
Зарегистрирован: 26 июл 2010, 08:54
Репутация: 30
Откуда: Ногинск

Re: поиск файла

Сообщение Алекс » 12 авг 2011, 11:46

1. На каком языке (на С++ кусок более-менее подходящего текста могу прислать)?
2. Где искать (есть по крайне мере конкретная папка или хотя бы диск)?

В общем случае - перебрать все файлы на диске, отделить от полного пути имя файла и сравнить с исходным.

Роман01
Участник
Сообщения: 66
Зарегистрирован: 03 авг 2010, 04:24
Репутация: 0

Re: поиск файла

Сообщение Роман01 » 12 авг 2011, 11:59

Хотелось бы на MapBasic.
Желательно на всех дисках, но хотя бы на С:
А как это организовать на MapBasic?

Voltron
Гуру
Сообщения: 2627
Зарегистрирован: 29 мар 2007, 14:12
Репутация: 34
Откуда: Ukraine

Re: поиск файла

Сообщение Voltron » 12 авг 2011, 14:21

Смотрите в сторону рекурсивного обхода каталогов. Я хз есть ли в MapBasic возможность работы с файловой системой или нет, но вот вам код на обычном бейсике. Похожих примеров в гугле навалом.

SergS
Активный участник
Сообщения: 120
Зарегистрирован: 14 апр 2011, 13:24
Репутация: 5
Откуда: Екатеринбург

Re: поиск файла

Сообщение SergS » 12 авг 2011, 14:37

Алекс писал(а): В общем случае - перебрать все файлы на диске, отделить от полного пути имя файла и сравнить с исходным.
ну, в общем случае, достаточно перебирать не файлы, а папки, проверяя (тем же 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 на верхнем уровне
извиняюсь за рекурсию (так короче получается) :)

Ответить

Вернуться в «Общие вопросы»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя