Что нового

как сравнить расширения файлов?

nikita1996spb

Новичок
Сообщения
19
Репутация
0
Здравствуйте! Подскажите пожалуйста, как сделать так, чтобы скрипт сравнивал расширения 2 файлов(имена разные) и, исходя из результатов делал что-либо? Если можно, то функцией. Грубо говоря, так:
Код:
$file1 = "C:/wish.txt"
$file2 = "C:/fake.txt"
Func CompareType($path1,$path2)
сравнение расширений
If расширения совпадают then
Return 1
Else
Return 0
EndIf
EndFunc

CompareType($file1,$file2)
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
Код:
Func _ExtractFromPath($sPath, $ID)
	Local $sName, $sExt, $sFakePath
	$sName = StringRegExpReplace($sPath,"^.*\\(.*?)$",'\1')
	If $sName == $sPath Then $sName = ''
	$sExt = StringRegExpReplace($sName, ".*\.(.*?)$", '\1')
	If $sExt == $sName Then 
		$sExt = ''
	Else
		$sExt = '.' & $sExt
		$sName = StringReplace($sName,$sExt,'')
	EndIf
	$sFakePath = StringReplace($sPath, $sName & $sExt,'')
	Switch $ID
		Case 1
			Return $sName
		Case 2
			Return $sExt
		Case 3
			Return $sFakePath
		Case 4 
			Return $sName & $sExt
	EndSwitch
EndFunc

Писал функцию под себя. Может она Вам поможет чем нибудь
 
Автор
N

nikita1996spb

Новичок
Сообщения
19
Репутация
0
Извиняюсь, я autoit недавно изучать начал, поэтому прошу Вас объяснить, что эта функция делает и объяснить значение параметра
Код:
"^.*\\(.*?)$"

Заранее спасибо!
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
Функция используется так:
Код:
_ExtractFromPath("C:/wish.txt", 2)

Выполнение ф-ии нам даст txt
Т.е. что бы сравнивать расширения ее нужно использовать как:
Код:
$file1 = "C:/wish.txt"
$file2 = "C:/fake.txt"

CompareType($file1,$file2)

Func _ExtractFromPath($sPath, $ID)
	Local $sName, $sExt, $sFakePath
	$sName = StringRegExpReplace($sPath,"^.*\\(.*?)$",'\1')
	If $sName == $sPath Then $sName = ''
	$sExt = StringRegExpReplace($sName, ".*\.(.*?)$", '\1')
	If $sExt == $sName Then 
		$sExt = ''
	Else
		$sExt = '.' & $sExt
		$sName = StringReplace($sName,$sExt,'')
	EndIf
	$sFakePath = StringReplace($sPath, $sName & $sExt,'')
	Switch $ID
		Case 1
			Return $sName
		Case 2
			Return $sExt
		Case 3
			Return $sFakePath
		Case 4 
			Return $sName & $sExt
	EndSwitch
EndFunc

Func CompareType($path1,$path2)
If _ExtractFromPath($path1, 2) == _ExtractFromPath($path2, 2) Then
	Return 1 ;совпадает
Else
	Return 0 ; не совпадает
EndIf
EndFunc

А то, что Вы спросили, это паттерн по которому обрезается путь, который задается в переменную.
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Код:
$FirstFile = 'C:\test.txt' ;Первый файл
$SecondFile = 'C:\hello.doc' ;Второй файл

If _CompareType($FirstFile, $SecondFile) = 1 Then ;Если разширение одинаковы
	;Какой-то действие
Else ;Если разширение не одинаковы
	;Какой-то действие
EndIf

;Функция для сравнение
;Возвращяет 1 если разширения одинаковы и 0 - если нет.
Func _CompareType($iFile1, $iFile2)
	Local $FileExp1 = StringRegExpReplace($iFile1, '.*\.(\S+)', '\1')
	Local $FileExp2 = StringRegExpReplace($iFile2, '.*\.(\S+)', '\1')

	If $FileExp1 = $FileExp2 Then
		Return 1
	Else
		Return 0
	EndIf
EndFunc
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
Zaramot
Если ему попадется папка с точкой, или файл с несколькими точками - то функция сработает криво =)
Хотя в принципе и моя функция не идеальна. :scratch:
 
Автор
N

nikita1996spb

Новичок
Сообщения
19
Репутация
0
Всем спасибо! Нашёл решение сам:
Код:
Func CompareType($path1,$path2)
Local $r1 = StringMid( $path1, StringLen($path1)-2, 3)
Local $r2 = StringMid( $path2, StringLen($path2)-2, 3)
;Выделяем из пути к файлу 3 последних буквы и сравниваем 
If $r1 == $r2 Then
	MsgBox(0,"","Расширения одинаковые")
Else
	MsgBox(0,"","Расширения разные")
EndIf
EndFunc

Досвидания!
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,323
Medic84 [?]
Если ему попадется папка с точкой, или файл с несколькими точками
Если эти файлы или папки существуют, то можно воспользоваться двумя функциями из WinAPIEx.au3
Код:
_WinAPI_PathIsDirectory($sPath)
_WinAPI_PathFindExtension($sPath)

nikita1996spb [?]
Выделяем из пути к файлу 3 последних буквы и сравниваем
А как будет работать с, например, test.html или с google-translate.js ? :whistle:
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
madmasles [?]
Если эти файлы или папки существуют, то можно воспользоваться двумя функциями из WinAPIEx.au3
Я не об этом. Просто немного RegExp неправильно написан.

nikita1996spb [?]
;Выделяем из пути к файлу 3 последних буквы и сравниваем
А если файл имеет 4 или 2 или 1 букву расширения? Или расширения вообще нет?
 
Автор
N

nikita1996spb

Новичок
Сообщения
19
Репутация
0
Писал для себя, у меня файлов без расширения нет. Почти все файлы имеют трёхбуквенное расширение, у четырёхбуквенных последние три буквы тоже разные. Кому ещё надо, тот может поменять. Для себя я решение нашёл.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Код:
Func FindAllPath($sPath)
	Dim $aAllPath[4]
	$sParentDir = ''
	$aPath = StringSplit($sPath, '\')
	If $aPath[0] = 2 $sParentDir = 'aPath' & ':\'
	For $i = 1 to $aPath[0] - 1
		$sParentDir &= $aPath[$i] & '\'
	Next
	$aAllPath[0] = $sParentDir
	$sFileName = $aPath[$aPath[0]]
	$aAllPath[1] = $sFileName
	$sExt = ''
	$aFileName = StringSplit($sFileName, '.')
	$sFileNameRoot = $aFileName[1]
	$aAllPath[2] = $sFileNameRoot
	If $aFileName[0] > 1 $sExt = $aFileName[$aFileName[0]]
	$aAllPath[3] = $sExt
	Return $aAllPath
EndFunc
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,323
Kaster,
Интересно, сколько еще вариантов есть. :smile:
Код:
;$sPath = 'F:\Addons\3-dllsfull\Run'
$sPath = 'C:\Documents and Settings\Admin\Рабочий стол\12.3456.432..txt'
$iCount = StringInStr($sPath, '.', 0, -1)
If $iCount Then
	MsgBox(64, 'Info', 'Extension: ' & StringTrimLeft($sPath, $iCount))
Else
	MsgBox(64, 'Info', 'No Extension')
EndIf
 

kaster

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

AZJIO

Меценат
Меценат
Сообщения
2,894
Репутация
1,196
nikita1996spb
Код:
$file1 = "C:\wish.txt"
$file2 = "C:\wis4325h.txt"
; !i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i
If _Type1($file1)=_Type1($file2) Then
	MsgBox(0, 'первый вариант', 'Совпадают')
Else
	MsgBox(0, 'первый вариант', 'Не совпадают')
EndIf
Func _Type1($Path)
	Local $SLen, $tmp
	$SLen=StringLen($Path)
	$tmp=StringInStr($Path, '.', 0, -1, $SLen, $SLen-StringInStr($Path, '\', 0, -1))
	If $tmp = 0 Then Return SetError(1, 0, '')
	Return StringTrimLeft($Path, $tmp)
EndFunc
; !i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i
If _Type2($file1)=_Type2($file2) Then
	MsgBox(0, 'второй вариант', 'Совпадают')
Else
	MsgBox(0, 'второй вариант', 'Не совпадают')
EndIf

Func _Type2($Path)
	Local $tmp
	$tmp=StringInStr($Path, '.', 0, -1)
	If $tmp = 0 Then Return SetError(1, 0, '')
	$tmp=StringTrimLeft($Path, $tmp)
	If StringInStr($tmp, '\') Then
		Return SetError(1, 0, '')
	Else
		Return $tmp
	EndIf
EndFunc
; !i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i
If _Type3($file1)=_Type3($file2) Then
	MsgBox(0, 'третий вариант', 'Совпадают')
Else
	MsgBox(0, 'третий вариант', 'Не совпадают')
EndIf

Func _Type3($Path)
	If StringRegExp($Path, '^(?:.*\.)([^\\]+)$') Then
		Return StringRegExpReplace($Path, '^(?:.*\.)([^\\]+)$', '\1')
	Else
		Return SetError(1, 0, '')
	EndIf
EndFunc
 
Верх