Что нового

[Файловая система] Получение имени папки в определенном каталоге по маске.

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Мы имеем папку *-savedata где * случайные цифры и буквы.
Необходимо узнать эти буквы и получить доступ к файлу lastsave.xxx.

If FileExists(@AppDataDir & "\x32Loader\*-savedata\lastsave.xxx") = 1 Then

Но это не работает.
Заранее спасибо.
 
Автор
firex

firex

AutoIT Гуру
Сообщения
943
Репутация
208
В первой теме, там где приведен ниже пример - подключен внешний dll.
Мне бы организовать все это в AutoIt.
Еще приходило в голову получить список папок в данном каталоге и отсортировать их.
Но вот как осуществить понятия не имею.
Сейчас начинаю изучать вторую.
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Разве так не подходит?

Код:
MsgBox(0,'',_SearchTreeForFile("C:", "NOTEPAD.exe"))

Func _SearchTreeForFile($sRootPath, $sFileName)
    If StringRight($sRootPath, 1) <> '\' Then $sRootPath &= '\'
    Local $sOutputPathBuffer = ''
    Local $aRet = DllCall("imagehlp.dll", 'long', 'SearchTreeForFile', 'str', _
            $sRootPath, 'str', $sFileName, 'str', $sOutputPathBuffer)
    If $aRet[0] = 1 Then
        Return $aRet[3]
    Else
        Return 0
    EndIf
EndFunc
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Вот ещё... если понадобится

Код:
#include <Array.au3>

$aFiles = _FileSearch(@DesktopDir, "*.txt")

_ArrayDisplay($aFiles)

Func _FileSearch($sPath, $sMask="*")
    If Not StringInStr(FileGetAttrib($sPath & "\"), "D") Then Return SetError(1, 0, 0)

    Local $hSearch, $sFindNext, $sFilePath, $iPathIsFolder, $i = 0, $sRet = ""
    Local $sRegExpFilter = StringReplace(StringReplace(StringReplace($sMask, ".", "\."), "*", ".*"), "?", ".")
    Local $iMax_Ret_Paths = 10000
    Local $aPathesArr[$iMax_Ret_Paths+1] = [1, $sPath]

    While $i < $aPathesArr[0]
        $i += 1

        $hSearch = FileFindFirstFile($aPathesArr[$i] & "\*")
        If $hSearch = -1 Then ContinueLoop

        While 1
            $sFindNext = FileFindNextFile($hSearch)
            If @error Then ExitLoop

            $sFilePath = $aPathesArr[$i] & "\" & $sFindNext
            $iPathIsFolder = StringInStr(FileGetAttrib($sFilePath & "\"), "D")

            If $iPathIsFolder Then
                If $aPathesArr[0] >= $iMax_Ret_Paths Then
                    $iMax_Ret_Paths *= 2
                    ReDim $aPathesArr[$iMax_Ret_Paths+1]
                EndIf

                $aPathesArr[0] += 1
                $aPathesArr[$aPathesArr[0]] = $sFilePath
            ElseIf StringRegExp($sFindNext, "(?i)\A" & $sRegExpFilter & "\z") Then
                $sRet &= $sFilePath & @CRLF
            EndIf
        WEnd

        FileClose($hSearch)
    WEnd

    $sRet = StringSplit(StringStripWS($sRet, 3), @CRLF, 1)
    If @error Then Return SetError(1, 0, -1)

    Return $sRet
EndFunc
 
Автор
firex

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Пожалуй подожду еще кодеров, а то у меня здесь большие проблемы после.
Вот если бы можно просто узнать имя этой папки, часть ее имени известно.



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

Разве никто не знает как получить полное имя папки, если известна только часть имени?
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
А мне вдруг что-то показалось, что автор зловред пишет.
Хотя, я могу ошибаться, но вот эти строки мне показались подозрительными:
Мы имеем папку *-savedata где * случайные цифры и буквы.
Это раз.
Код:
Необходимо узнать эти буквы и получить доступ к файлу lastsave.xxx.
Это два.
А так узнали имя папки и задаем список нужных файлов.
Это три.
Вот если бы можно просто узнать имя этой папки, часть ее имени известно.
Это четыре.
Может я и не прав, но ....
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Согласен, есть что-то подозрительное, но наверное ошибаемся
 
Автор
firex

firex

AutoIT Гуру
Сообщения
943
Репутация
208
Вообщето я делаю программу, которая будет постоянно собирать информацию с сервера и отсылать мне на мыло по моей команде.
И к сожалению сервер сам создает такую папку, моей вины нет.


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

И если быть точным, то у тебя 3 подозрения, а не 4. 2 из них "однотипные".
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Код:
If FileExists(@AppDataDir & "\x32Loader\*-savedata\lastsave.xxx") = 1 Then

Возможно, у Вас локальный сервер, с адресом C:\Program Files\ ...
Так так бы и рассказали
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Тут нужна функция для проверки каталогов по маске:

Код:
$sPath = @AppDataDir & "\x32Loader\*-savedata\lastsave.xxx"

If _FileExistsEx($sPath) Then
	MsgBox(64, 'Title', 'Exists, full path:' & @CRLF & $sPath)
EndIf

Func _FileExistsEx(ByRef $sPath)
	If Not StringRegExp($sPath, "[\*\?]") Then
		Return FileExists($sPath)
	EndIf
	
	$aSplit = StringSplit($sPath, "\")
	$sPath = $aSplit[1]
	
	For $i = 2 To $aSplit[0]
		If StringRegExp($aSplit[$i], "[\*\?]") Then
			$hSearch = FileFindFirstFile($sPath & "\" & $aSplit[$i])
			$iExtended = 0
			
			If $hSearch <> -1 Then
				While 1
					$sNext = FileFindNextFile($hSearch)
					
					If @error = 1 Or @extended = 1 Then
						$iExtended = @extended
						ExitLoop
					EndIf
					
					If $i = $aSplit[0] And @extended = 0 Then
						$iExtended = 1
						ExitLoop
					EndIf
				WEnd
				
				FileClose($hSearch)
				
				If Not $iExtended Then
					Return 0
				Else
					$sPath &= "\" & $sNext
				EndIf
			EndIf
		Else
			$sPath &= "\" & $aSplit[$i]
		EndIf
	Next
	
	Return FileExists($sPath)
EndFunc


Конвертирует путь с маской в полный путь (изменяет значение параметра $sPath - ByRef).
 
Верх