Что нового

[Файловая система] Программа для создания символических/жестких ссылок в файловой системе NTFS

aleratorio

Осваивающий
Сообщения
85
Репутация
43
AutoIt: 3.3.6.1
Версия: 1.0

Категория: Файловая система

Описание: Программа для создания символических/жестких ссылок в файловой системе NTFS
Windows Vista и выше...
Позволяет создавать символические ссылки(simbolic links) на файлы/каталоги/диски,
жесткие ссылки(hard links) на файлы и соединения(junction points) для каталогов/дисков
в файловой системе ntfs.
По сути является графическим интерфейсом для системной команды mklink.

Windows XP/2000...
Позволяет создавать жесткие ссылки(hard links) на файлы и соединения(junction points)
для каталогов/дисков в файловой системе ntfs.
Cимволические ссылки(simbolic links) в Windows XP/2000 не поддерживаются.
Использует внешнюю программу appendix\mklink.exe (appendix\mklink64.exe для 64 битных
версий системы), т.к. Windows XP/2000 не имеет встроенной команды mklink.
Если программу не планируется использовать в Windows XP/2000, папку appendix можно
удалить.

При установке флага "Интегрировать в контекстное меню" - В контекстном меню
файлов/каталогов/дисков появляется пункт "Создать NTFS ссылку..." который
автоматически заполняет поле "Источник" для данного файла/каталога/диска.

Код/Пример:
Код:
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_icon=MakeLink.ico
#AutoIt3Wrapper_Res_Description=Создание ссылок NTFS
#AutoIt3Wrapper_Res_Fileversion=1.0.0.15
#AutoIt3Wrapper_Res_Fileversion_AutoIncrement=Y
#AutoIt3Wrapper_Res_LegalCopyright=aleratorio
#AutoIt3Wrapper_Res_Language=1049
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

#cs ----------------------------------------------------------------------------

	AutoIt Version: 3.3.6.1
	Author:        aleratorio

	Script Function:
	Оболочка для mklink(создание ссылок NTFS)
#ce ----------------------------------------------------------------------------

AutoItSetOption("TrayAutoPause", 0)

#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

#Region ### START Koda GUI section ### Form=C:\!-= ДОКУМЕНТЫ =-\Programming\Scripts\NtfsLinks\MakeLink.kxf
$Form1 = GUICreate("MakeLink", 565, 178, 192, 124)
$Input_Source = GUICtrlCreateInput("", 76, 3, 354, 25, BitOR($GUI_SS_DEFAULT_INPUT, $ES_READONLY))
$Label1 = GUICtrlCreateLabel("Источник:", 6, 9, 55, 17)
$Label2 = GUICtrlCreateLabel("Назначение:", 6, 34, 68, 17)
$Input_Dest = GUICtrlCreateInput("", 76, 30, 354, 25, BitOR($GUI_SS_DEFAULT_INPUT, $ES_READONLY))
$Checkbox_Integrate = GUICtrlCreateCheckbox("Интегрировать в", 436, 83, 113, 17)
$Button_Create = GUICtrlCreateButton("Создать", 196, 150, 75, 25)
$Button_Cancel = GUICtrlCreateButton("Выход", 286, 150, 75, 25)
$Button_SourceDir = GUICtrlCreateButton("Каталог...", 436, 2, 62, 25)
$Button_DestDir = GUICtrlCreateButton("Каталог...", 436, 30, 62, 25)
$Button_SourceFile = GUICtrlCreateButton("Файл...", 500, 2, 62, 25)
$Radio_None = GUICtrlCreateRadio("Символическая ссылка на файл", 213, 127, 205, 17)
$Radio_D = GUICtrlCreateRadio("Символическая ссылка на каталог", 7, 127, 197, 17)
$Radio_H = GUICtrlCreateRadio("Жесткая ссылка на файл", 213, 83, 159, 17)
$Radio_J = GUICtrlCreateRadio("Соединение для каталога", 7, 83, 173, 17)
$Input_LinkName = GUICtrlCreateInput("", 76, 57, 354, 25)
$Label3 = GUICtrlCreateLabel("Имя ссылки:", 6, 60, 70, 17)
$Label4 = GUICtrlCreateLabel("Для Windows Vista и выше:", 13, 110, 141, 17)
$Label5 = GUICtrlCreateLabel("контекстное меню", 453, 100, 99, 17)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

Global $Source = "" ;диск/каталог/файл на который будет указывать ссылка
Global $Dest = ""   ;диск/каталог в котором будет находиться ссылка
Global $Param = ""  ;параметр для mklink ("" - символическая ссылка на файл; "/D " - символическая ссылка на каталог;
                                         ;"/H " - жесткая ссылка на файл;    "/J " - соединение для каталога          )

;Определяем версию ОС, т.к. символические ссылки возможны только в Windows Vista и выше
Global $Is_XP_2000 = (@OSVersion = "WIN_XP") Or (@OSVersion = "WIN_XPe") Or (@OSVersion = "WIN_2000")

Main()
Exit

Func Main()
	If $Is_XP_2000 Then
		GUICtrlSetState($Radio_D, $GUI_DISABLE)
		GUICtrlSetState($Radio_None, $GUI_DISABLE)
	EndIf

	;проверка параметров командной строки (передаются, если был выбран пункт в контекстном меню - Создать NTFS ссылку...)
	If $CmdLine[0] <> 0 Then
		If $CmdLine[1] = "-d" Then ;выбран каталог/диск
			SetSourceDir($CmdLine[2])
		ElseIf $CmdLine[1] = "-f" Then ;выбран файл
			SetSourceFile($CmdLine[2])
		Else
			ErrorMsgBox("Неверные параметры командной строки")
			Exit
		EndIf
	EndIf

	;проверка интеграции в контекстное меню
	If RegRead("HKCR\Directory\shell\Создать NTFS ссылку...\command", "") <> "" Then GUICtrlSetState($Checkbox_Integrate, $GUI_CHECKED)

	While 1
		$nMsg = GUIGetMsg()
		Switch $nMsg
			Case $GUI_EVENT_CLOSE
				Exit
			Case $Button_Cancel
				Exit
			Case $Checkbox_Integrate
				Integrate()
			Case $Button_Create
				CreateLink()
			Case $Button_SourceDir
				SetSourceDir(FileSelectFolder("MakeLink | Выбор каталога/диска на который будет указывать ссылка...", "", 3, StringTrimRight($Source, StringLen($Source) - StringInStr($Source, "\", 0, -1))))
			Case $Button_DestDir
				SetDestinationDir(FileSelectFolder("MakeLink | Выбор каталога/диска в котором будет находиться ссылка...", "", 3, $Dest))
			Case $Button_SourceFile
				SetSourceFile(FileOpenDialog("MakeLink | Выбор файла на который будет указывать ссылка...", $Source, "All(*.*)"))
			Case $Radio_None
				$Param = ""
			Case $Radio_D
				$Param = "/D "
			Case $Radio_H
				$Param = "/H "
			Case $Radio_J
				$Param = "/J "
		EndSwitch
	WEnd
EndFunc   ;==>Main

Func SetSourceDir($ret)
	If $ret = "" Then Return ;нажата отмена
	If StringTrimLeft($ret, 1) = ":\" Then ;выбран диск
		$Source = $ret
		GUICtrlSetData($Input_LinkName, "DRIVE_" & StringLeft($ret, 1), "")
	Else ;выбран каталог
		$Source = $ret & "\"
		GUICtrlSetData($Input_LinkName, PathGetDirName($Source), "")
	EndIf
	GUICtrlSetData($Input_Source, $Source, "")
	DirModeOn()
EndFunc   ;==>SetSourceDir

Func SetSourceFile($ret)
	If $ret = "" Then Return ;нажата отмена
	$Source = $ret
	GUICtrlSetData($Input_Source, $Source, "")
	GUICtrlSetData($Input_LinkName, PathGetFileName($Source), "")
	FileModeOn()
EndFunc   ;==>SetSourceFile

Func SetDestinationDir($ret)
	If $ret = "" Then Return ;нажата отмена
	If StringTrimLeft($ret, 1) <> ":\" Then $ret &= "\" ;выбран каталог (иначе - выбран диск - второй слэш не добавляем)
	$Dest = $ret
	GUICtrlSetData($Input_Dest, $Dest, "")
EndFunc   ;==>SetDestinationDir

Func PathGetFileName($path) ;возвращает имя файла по заданному полному пути
	return (StringTrimLeft($path, StringInStr($path, "\", 0, -1)))
EndFunc   ;==>PathGetFileName

Func PathGetDirName($path) ;возвращает имя каталога по заданному полному пути
	return (StringTrimRight(StringTrimLeft($path, StringInStr($path, "\", 0, -2)), 1))
EndFunc   ;==>PathGetDirName

Func DirModeOn() ;активирует переключатели возможных действий для каталога/диска
	GUICtrlSetState($Radio_None, $GUI_DISABLE)
	GUICtrlSetState($Radio_H, $GUI_DISABLE)
	GUICtrlSetState($Radio_J, $GUI_ENABLE)
	If $Is_XP_2000 Then
		GUICtrlSetState($Radio_J, $GUI_CHECKED)
		$Param = "/J "
	Else
		GUICtrlSetState($Radio_D, $GUI_ENABLE + $GUI_CHECKED)
		$Param = "/D "
	EndIf
EndFunc   ;==>DirModeOn

Func FileModeOn() ;активирует переключатели возможных действий для файла
	GUICtrlSetState($Radio_D, $GUI_DISABLE)
	GUICtrlSetState($Radio_H, $GUI_ENABLE)
	GUICtrlSetState($Radio_J, $GUI_DISABLE)
	If $Is_XP_2000 Then
		GUICtrlSetState($Radio_H, $GUI_CHECKED)
		$Param = "/H "
	Else
		GUICtrlSetState($Radio_None, $GUI_ENABLE + $GUI_CHECKED)
		$Param = ""
	EndIf
EndFunc   ;==>FileModeOn

Func Integrate() ;интегрирует команду в контекстное меню
	If BitAND(GUICtrlRead($Checkbox_Integrate), $GUI_CHECKED) Then
		RegWrite("HKCR\Directory\shell\Создать NTFS ссылку...\command", "", "REG_SZ", @ScriptDir & '\makelink.exe -d "%1"')
		RegWrite("HKCR\Drive\shell\Создать NTFS ссылку...\command", "", "REG_SZ", @ScriptDir & '\makelink.exe -d "%1"')
		RegWrite("HKCR\*\shell\Создать NTFS ссылку...\command", "", "REG_SZ", @ScriptDir & '\makelink.exe -f "%1"')
	Else
		RegDelete("HKCR\Directory\shell\Создать NTFS ссылку...")
		RegDelete("HKCR\Drive\shell\Создать NTFS ссылку...")
		RegDelete("HKCR\*\shell\Создать NTFS ссылку...")
	EndIf
EndFunc   ;==>Integrate

Func ErrorMsgBox($message)
	MsgBox(16, "MakeLink | Ошибка...", $message)
EndFunc   ;==>ErrorMsgBox

Func CreateLink()
	If $Source = "" Then
		ErrorMsgBox("Не задан исходный диск/каталог/файл")
		Return
	EndIf

	If $Dest = "" Then
		ErrorMsgBox("Не задан диск/каталог назначения")
		Return
	EndIf

	$LinkName = GUICtrlRead($Input_LinkName)
	If $LinkName = "" Or StringIsSpace($LinkName) Then
		ErrorMsgBox("Не указано имя ссылки")
		Return
	EndIf

	$ret = 1

	If $Is_XP_2000 Then ;для Windows XP/2000 вызываем внешнюю программу appendix\mklink.exe, т.к. они не имеют встроенной команды
		If @OSArch = "X86" Then
			$ret = ShellExecuteWait(@ScriptDir & "\appendix\mklink.exe", $Param & '"' & $Dest & $LinkName & '" ' & FileGetShortName($Source), "", "", @SW_HIDE)
		ElseIf @OSArch = "X64" Then
			$ret = ShellExecuteWait(@ScriptDir & "\appendix\mklink64.exe", $Param & '"' & $Dest & $LinkName & '" ' & FileGetShortName($Source), "", "", @SW_HIDE)
		EndIf
	Else	 ;для Vista и выше вызываем встроенную команду
		$ret = ShellExecuteWait(@ComSpec, "/c mklink " & $Param & '"' & $Dest & $LinkName & '" "' & $Source & '"', "", "", @SW_HIDE)
	EndIf

	If @error Or $ret <> 0 Then
		ErrorMsgBox("Не удалось создать ссылку")
		Return
	EndIf

	MsgBox(64, "MakeLink", "Ссылка успешно создана")
EndFunc   ;==>CreateLink

Файл:MakeLink.rar
В архиве присутствует скомпилированный скрипт, исходник, и дополнения для Windows XP/2000
Интеграция в контекстное меню работает только с исполняемым файлом.

Снимок:

История версий:
v1.0
* Первый релиз.

Автор(ы): aleratorio
 
Верх