Что нового

Можноли обойти имя папки заменив егонамаску если название п-ки постояно меняется

agikon

Знающий
Сообщения
789
Репутация
17
Можно ли обойти имя папки заменив его на маску если название папкики постояно меняется?
Ну от на пути постоянно изменяется папка, но конечная папка известна, можно ли какк то папку толи по маске прописать оли ещё както?

ну например
C:\Documents and Settings\Admin\Мои документы\тут название папки постоянно меняется\top
 
Автор
A

agikon

Знающий
Сообщения
789
Репутация
17
это хорошо что можно.
а не знаете как?
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
agikon
предоставленной информации недостаточно, для однозначного решения проблемы
1. изменяется – это слишком общее понятие. как изменяется? есть ли хоть какая-то закономерность в изменениях?
2. если же нет, и названия полностью произвольные, то есть ли другие папки на том же уровне вложенности, что и искомая? если есть, может ли оказаться так, что в них тоже есть подпапка "top"?
 
Автор
A

agikon

Знающий
Сообщения
789
Репутация
17
вы както усложняете ситуацию.
зачем тут исать закономерность? папки которые создает кеш интернет эксплорера видели? вот такие они 5В45J2. никакой закономерности нет.

то есть ничего сложного в самой постановке вопроса нет, надо просто перепрыгнуть через ту папку каторая указана красным цаетом и всё.структура всего пути не меняется.

AZJIO
возможно это то что и требуется, завтра посмотрю и отпишусь.
только хорошо если бы выложиле сюда этот код а то там скоко всего глаза разбеются :smile:
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
agikon [?]
вы както усложняете ситуацию.
не усложняю, а проясняю.
зачем тут исать закономерность?
дальше этого места мой пост читать не стал? ответ там.
папки которые создает кеш интернет эксплорера видели?
видел. только вот пытаюсь сообразить, каким местом я должен был допереть, что ты имеешь в виду именно эти папки...
никакой закономерности нет.
это и есть ответ на вопрос. зачем все остальные слова предшествующие этому мне не понятно
то есть ничего сложного в самой постановке вопроса нет
сложного нет. это ты сам что-то додумываешь. а вот неоднозначность есть.
надо просто перепрыгнуть через ту папку каторая указана красным цаетом и всё.структура всего пути не меняется.
опять же, прочитай мои вопросы. они же не спроста заданы. правильно сформулированный вопрос – это половина решения


Добавлено:
Сообщение автоматически объединено:

и еще, я тебе настоятельно рекомендую не коверкать русский язык. пользуйся функцией редактирования сообщений.
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Код:
#include <Array.au3>
#include <File.au3>

$Find = _GetAllSubfolders('C:\Documents and Settings\Admin\Мои документы')
$Index = _ArraySearch($Find, '\top', 0, 0, 0, 1)
If @error Then MsgBox(48, 'Путь', 'Такой папки нет')
MsgBox(64, 'Путь', $Find[$Index])


Func _GetAllSubfolders($MainFolder)
    Dim $ToDoList[1]
    Dim $ResultList[1]
    $ToDoList = _AddSubfoldersToArray( $MainFolder, $ToDoList )

    Do
        $Folder = $ToDoList[1]
        _ArrayDelete($ToDoList, 1)
        _ArrayAdd($ResultList, $Folder)
        $ToDoList = _AddSubfoldersToArray( $Folder, $ToDoList )
    Until (UBound($ToDoList)-1) = 0

    Return $ResultList
EndFunc

Func _AddSubfoldersToArray( $FolderPath, $InputArray )
    Dim $OutputArray[1]
    $OutputArray = $InputArray
    $ListOfSubfolders = _FileListToArray( $FolderPath, "*.*", 2 )

    For $i=1 To (UBound($ListOfSubfolders)-1)
        $Folder = $ListOfSubfolders[$i]
        _ArrayAdd( $OutputArray, $FolderPath &"\" &$Folder )
    Next

    Return $OutputArray
EndFunc


Если папка top находится в Мои документы (можно задать любую-другую) то скрипт покажет полный путь до неё. Даже если она находится в подпапках :smile:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
agikon,
Попробуйте так:
Код:
#include <File.au3>

$iError = 1
$sDir = @MyDocumentsDir
$sSearchDir = 'top'
$sSearchDirPath = ''

For $i = 1 To 1
	$aTemp_1 = _FileListToArray($sDir, '*', 2)
	If @error Then ExitLoop
	For $j = 1 To $aTemp_1[0]
		$aTemp_2 = _FileListToArray($sDir & '\' & $aTemp_1[$j], '*', 2)
		If @error Then ContinueLoop
		For $q = 1 To $aTemp_2[0]
			If $aTemp_2[$q] == $sSearchDir Then
				$sSearchDirPath = $sDir & '\' & $aTemp_1[$j] & '\' & $aTemp_2[$q]
				$iError = 0
				ExitLoop 3
			EndIf
		Next
	Next
	$iError = 2
Next
If @error = 4 Then
	MsgBox(16, 'Error', 'В папке [' & $sDir & '] нет подпапок')
Else
	Switch $iError
		Case 0
			MsgBox(64, 'Info', $sSearchDirPath)
		Case 1
			MsgBox(16, 'Error', 'Error')
		Case 2
			MsgBox(16, 'Error', 'Нет папки [' & $sSearchDir & ']')
	EndSwitch
EndIf
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Вообще, стремная идея, но все же задачка довольно прикольная, на рекурсию. Вот функция, которая возвращает первый найденный путь для папки или файла удовлетворяющий заданному шаблону. Если нужна именно папка, то ставим в конце пути "\". Имя диска должно быть указано в явном виде (C:, D: и т.д.). Русский язык также поддерживается.

Код:
ConsoleWrite(_GetAppropriatePath('C:\Program*\AutoIt*\AutoIt*.exe') & @CR)
ConsoleWrite(_GetAppropriatePath('C:\*\System??\user??.dll') & @CR)
ConsoleWrite(_GetAppropriatePath('C:\???????\explorer.exe') & @CR)
ConsoleWrite(_GetAppropriatePath('C:\*\Fon*\') & @CR)

Func _GetAppropriatePath($sPath, $iLevel = 0)

	Local $hSearch, $tPath, $File, $Item, $Path, $Ret, $Dir = '', $Suf = '', $Result = ''

	$tPath = DllStructCreate('wchar[1024]')
	$Ret = DllCall('kernel32.dll', 'dword', 'GetFullPathNameW', 'wstr', $sPath, 'dword', 1024, 'ptr', DllStructGetPtr($tPath), 'ptr', 0)
	If (@error) Or (Not $Ret[0]) Then
		Return ''
	EndIf
	$sPath = DllStructGetData($tPath, 1)
	If StringRight($sPath, 1) = '\' Then
		$Dir = '\'
	EndIf
	$Item = StringSplit(StringRegExpReplace($sPath, '\\\Z', ''), '\')
	Select
		Case $iLevel + 1 = $Item[0]
			If FileExists($sPath) Then
				Return $sPath
			Else
				Return ''
			EndIf
		Case $iLevel + 1 > $Item[0]
			Return ''
	EndSelect
	For $i = 1 To $iLevel + 1
		$Result &= $Item[$i] & '\'
	Next
	$Result = StringRegExpReplace($Result, '\\\Z', '')
	If Not FileExists($Result) Then
		Return ''
	EndIf
	$hSearch = FileFindFirstFile($Result & '\*')
	If $hSearch = -1 Then
		Return ''
	EndIf
	For $i = $iLevel + 3 To $Item[0]
		$Suf &= '\' & $Item[$i]
	Next
	While 1
		$File = FileFindNextFile($hSearch)
		If @error Then
			$Result = ''
			ExitLoop
		EndIf
		If (Not @extended) And ($Dir) And ($iLevel + 2 = $Item[0]) Then
			ContinueLoop
		EndIf
		$Ret = DllCall('shlwapi.dll', 'int', 'PathMatchSpecW', 'wstr', $File, 'wstr', $Item[$iLevel + 2])
		If (Not @error) And ($Ret[0]) Then
			$Path = _GetAppropriatePath($Result & '\' & $File & $Suf & $Dir, $iLevel + 1)
			If $Path Then
				$Result = $Path
				ExitLoop
			EndIf
		EndIf
	WEnd
	FileClose($hSearch)
	Return $Result
EndFunc   ;==>_GetAppropriatePath


Для автора, как я понимаю, это должно выглядеть так:

Код:
ConsoleWrite(_GetAppropriatePath('C:\Documents and Settings\Admin\Мои документы\*\top\') & @CR)


Но если папка "top" присутствует в нескольких папках верхнего уровня, то получите первую найденную.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Yashied [?]
Имя диска должно быть указано в явном виде (C:, D: и т.д.)
У меня работает и так:
Код:
ConsoleWrite(_GetAppropriatePath(@MyDocumentsDir & '\*\top\') & @CR)
Только с @HomeDrive выдает пустую строку.
А зачем в параметрах функции $iLevel ? У меня при любом не нулевом значении - пустая строка. Вернее, как запретить при первом проходе не нулевое значение.
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Нашел самый простой способ :laugh::
Код:
$First = FileFindFirstFile(@MyDocumentsDir & '\*')
While 1
	$Next = FileFindNextFile($First)
	If @error Then Exit
	If FileExists(@MyDocumentsDir & '\' & $Next & '\top\') Then ExitLoop MsgBox(0, 'Путь', @MyDocumentsDir & '\' & $Next & '\top')
WEnd


А вот в виде функции:
Код:
$WhereSearch = @MyDocumentsDir  ;Где ввести поиск
$WhatSearch = 'top' ;Папка для поиска

$Search = _GetPath($WhereSearch, $WhatSearch)
MsgBox(0, 'Путь', $Search)

Func _GetPath($Where, $What)
	$First = FileFindFirstFile($Where & '\*')
	While 1
		$Next = FileFindNextFile($First)
		If @error Then Exit
		If FileExists($Where & '\' & $Next & '\' & $What & '\') Then
			Return $Where & '\' & $Next & '\' & $What
			ExitLoop
		EndIf
	WEnd
EndFunc
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
madmasles сказал(а):
Вернее, как запретить при первом проходе не нулевое значение.

$iLevel - номер элемента в полном пути до которого (включая его самого) не производится поиск, начиная с 0 (0 - первый элемент, т.е. имя диска). Нужен исключительно для рекурсивного вызова. Например, можно записать так:

Код:
_GetAppropriatePath('C:\Program Files\AutoIt3\*\WinAPIEx.au3', 2)


Здесь первые три элемента заданы явным образом, и их можно пропустить. А вот такая запись приведет к ошибке:

Код:
_GetAppropriatePath('C:\Program Files\AutoIt?\*\WinAPIEx.au3', 2)
 
Автор
A

agikon

Знающий
Сообщения
789
Репутация
17
вечерком сяду буду шаманить, потом напишу чей вариант подойдёт более всего с точки зрения новичка(то есть с точки зрения такого такого нуба как я).
 
Автор
A

agikon

Знающий
Сообщения
789
Репутация
17
и так.
вот только сейчас разобрался.
спасибо всем кто внес в эту тему свою лепту. по крупице смотрел на разный код и в резулльтате в общих чертах прояснилось.

Но самым полезным оказался пост Zaramota где он это всё это дело упростил. Хоть это и переделаный код от AZJIO, Zaramot сумел донести именно то что мне надо было лучше других кодов. действительно записал в понятной для нубов форме.
Вот даже получилось переделать код функции чтобы он удалял папку top через рандомную папку
Код:
Func _del()

	$First2  = FileFindFirstFile(@MyDocumentsDir & '\*')
        While 1
			$Next2 = FileFindNextFile($First2)
        	If @error Then exitloop
			If FileExists(@MyDocumentsDir & '\' & $Next2 & '\top\') Then exitloop DirRemove(@MyDocumentsDir & '\' & $Next2 & '\top\')
		  WEnd
			
EndFunc


а также вот переделал в случае удаления папки top через рандомную.
Код:
While 1
    $Next = FileFindNextFile($First)
    If @error Then exitloop MsgBox(64, 'Info', 'папки top нет!')
    If FileExists(@MyDocumentsDir & '\' & $Next & '\top\') Then exitloop DirRemove(@MyDocumentsDir & '\' & $Next & '\top\') and MsgBox(64, 'Info', 'папка top удалена')
WEnd


Всем большое спасибо.
 
Автор
A

agikon

Знающий
Сообщения
789
Репутация
17
с лёгкостью верю.
знач сори.
я просто самый первый код смотрел от AZJIO когда он мне ссылку кинул но так ничего в нём и не понял, и я подумал может и все остальные стали смотреть и тому так написал. Хотя не в обиду а в честь AZJIO-у скажу, что в коде от AZJIO ну тяжеловатый для восприятия, ну во всяком случае таким нубам как я.

Zaramot, так а чего вы не записываете такие перлы? записывайте гдето себе в блог, ну как AZJIO делает.А нубы пускай смотрят и выбирают где понятней :smile:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
agikon,
В коде Zaramot`a можно добавить проверку на папки, должно чуть быстрее работать:
Код:
$hFirst = FileFindFirstFile(@MyDocumentsDir & '\*')
While 1
	$sNext = FileFindNextFile($hFirst)
	If @error Then ExitLoop
	If @extended Then
		If FileExists(@MyDocumentsDir & '\' & $sNext & '\top\') Then _
				ExitLoop MsgBox(64, 'Info', @MyDocumentsDir & '\' & $sNext & '\top')
	EndIf
WEnd
FileClose($hFirst)
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
agikon
Ничего сложного, код примерно такой:

Код:
#include <Array.au3>
#include <_FileSearch.au3>
$FolderList=_FolderSearch(@UserProfileDir&'\Local Settings\Temporary Internet Files\Content.IE5', '*', 1, 1, 0)
If Not @error Then
	$FolderList=StringRegExp($FolderList, '(?m)^(.*\\top)\r$', 3)
	_ArrayDisplay($FolderList, 'Array')
EndIf


А примеры использования функции _FileSearch.au3 можно посмотреть здесь - _FileSearch_example.au3
 
Верх