Что нового

[Данные, строки] Вычисление относительного пути файла

lognik

Новичок
Сообщения
7
Репутация
0
Привет всем.
Нужен скрипт, который по переданным ему через парметры пути к дирректории и полному пути к файлу, вычислял путь к этому файлу относительно этой дирретории. Например, скрипту сообщается параметры:
script.exe "D:\Portableapps\proga\proga.exe" "D:\Portableapps\Filemenegers\totalсmd"
нужно вычислить относительный путь ..\..\proga\proga.exe и передать в буфер обмена
Как это можно осуществить??
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
lognik [?]
Нужен скрипт, который по переданным ему через парметры пути к дирректории и полному пути к файлу, вычислял путь к этому файлу относительно этой дирретории

Код:
#include <File.au3>

$sFrom = "D:\Portableapps\Filemenegers\totalсmd" ;$CmdLine[2]
$sTo = "D:\Portableapps\proga\proga.exe" ;$CmdLine[1]

$sRelative_Path = _PathGetRelative($sFrom, $sTo)

ConsoleWrite($sRelative_Path & @LF)
 
Автор
L

lognik

Новичок
Сообщения
7
Репутация
0
CreatoR, спасибо. Придётся обновить дистрибутив AutoIt, поскольку функции _PathGetRelative у меня нет.
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Вот ещё, без обновления дистрибутива

Код:
;#include <Array.au3>
If $CmdLine[0]>1 Then
	$Path1=$CmdLine[1]
	$Path2=$CmdLine[2]
Else
	$Path1='D:\Portableapps\proga\proga.exe'
	$Path2='D:\Portableapps\Filemenegers\totalсmd'
	;Exit
EndIf

;$aPath1=StringRegExp($Path1&'\','(.*?)(?:\\)',3)
;$aPath2=StringRegExp($Path2&'\','(.*?)(?:\\)',3)
$aPath1=StringRegExp($Path1,'(.*?)(?:\\)',3)
$aPath2=StringRegExp($Path2,'(.*?)(?:\\)',3)
$kol1=UBound($aPath1) - 1
$kol2=UBound($aPath2) - 1

If $kol1<$kol2 Then
	$min=$kol1
Else
	$min=$kol2
EndIf
;_ArrayDisplay( $aPath1, "Смотрим текущий массив aPath1" )
;_ArrayDisplay( $aPath2, "Смотрим текущий массив aPath2" )
$Path=''
For $i = 0 to $min
;MsgBox(0, "Сообщение", $aPath1[$i]&@CRLF&$aPath2[$i])
	If $aPath1[$i]=$aPath2[$i] Then
		$Path&=$aPath1[$i]&'\'
	Else
		ExitLoop
	EndIf
Next

ClipPut(StringTrimRight($Path, 1))
MsgBox(0, "Сообщение", StringTrimRight($Path, 1))
Exit


Нужно учитывать, что два пути
D:\Portableapps\Filemenegers\totalсmd\proga.exe
D:\Portableapps\Filemenegers\totalсmd
будут имет общий путь D:\Portableapps\Filemenegers, а не D:\Portableapps\Filemenegers\totalсmd. Чтоб сделать наоборот (включить жадный квалификатор), нужно раскомментировать 11, 12 строки и закомментировать 13, 14
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
lognik [?]
Придётся обновить дистрибутив AutoIt, поскольку функции _PathGetRelative у меня нет
Она добавлена с версии 3.3.0.0 (24th December, 2008 - v3.3.0.0).
 
Автор
L

lognik

Новичок
Сообщения
7
Репутация
0
AZJIO, благодарен за помощь, но с дистрибутивом я ошибся. Есть такая функция. Скрипт нормально заработал после компиляции. Вот всё что мне было нужно:
Код:
#include <File.au3>
ClipPut(_PathGetRelative($CmdLine[1], $CmdLine[2]))
 
Верх