Что нового

Работа с виртуальными (возможно и RAM) дисками

Astel064

Помог мой пост, ставь +!
Сообщения
276
Репутация
51
Здравствуйте, уважаемые форумчане.
Вопрос таков: возможно-ли с помощью Autoit (возможно и с использованием стороннего софта, только автоматизированно, т.е. без лишних кликов и т.д....) работать с виртуальными дисками?
Если кто знает, как работать с RAM дисками, либо какие-нибудь другие варианты - прошу помощи. Просьба, не предлагать использование команды subst... Надеюсь на Вашу помощь :smile:

Версия AutoIT: 3.3.6.1
ОС: Windows XP sp3
 

Naisho

Знающий
Сообщения
86
Репутация
12
Требуется установка ImDisk Virtual Disk Driver for Windows http://www.ltr-data.se/opencode.html/
Количество создаваемых папок - $numOfFolders
Где создавать - $type ("RAM" или "HDD") "DEL" - удалить папки
$folder_1 - задаём имя папки, получаем полный путь

Код:
;==============================================================================================
Func SubFunction_TEMPSpace_Create($type, $numOfFolders, ByRef $folder_1, ByRef $folder_2, ByRef $folder_3 ) ;, ByRef $folder_4 = "", ByRef $folder_5 = "", ByRef $folder_6 = "", ByRef $folder_7 = "", ByRef $folder_8 = "")
	Local $drive, $i, $folder[9], $err, $rootTempFolder = "_AutoIT_TemporaryFolder"
	If $numOfFolders <> (@NumParams - 2) Then
		SetError(1)
		Return $err = 1
	EndIf
	$folder[0] = $numOfFolders
	If $numOfFolders >= 1 Then $folder[1] = $folder_1
	If $numOfFolders >= 2 Then $folder[2] = $folder_2
	If $numOfFolders >= 3 Then $folder[3] = $folder_3
;	If $numOfFolders >= 4 Then $folder[4] = $folder_4
;	If $numOfFolders >= 5 Then $folder[5] = $folder_5
;	If $numOfFolders >= 6 Then $folder[6] = $folder_6
;	If $numOfFolders >= 7 Then $folder[7] = $folder_7
;	If $numOfFolders >= 8 Then $folder[8] = $folder_8
	If $type == "DEL" Then
		For $i = 1 To $folder[0]
			If FileExists($folder[$i]) Then DirRemove($folder[$i], 1)
		Next
		$rootTempFolder = StringLeft($folder_1, StringInStr($folder_1, $rootTempFolder) + StringLen($rootTempFolder) - 1 )
		If FileExists($rootTempFolder) Then DirRemove($rootTempFolder, 1)
		If DriveStatus("Z:\") <> "INVALID" Then RunWait('C:\WINDOWS\system32\imdisk.exe -D -m Z:')
	Else
		If $type == "RAM" Then
			If DriveStatus("Z:\") = "INVALID" Then RunWait('C:\WINDOWS\system32\imdisk.exe -a -t vm -m Z: -s 2G -p "/fs:ntfs /q /y /v:RamDisk"')
			If @error Then $type = "HDD"
		EndIf
		If $type == "RAM" Then $drive = "Z:\" & $rootTempFolder
		If $type == "HDD" Then $drive = @TempDir & "\" & $rootTempFolder
		For $i = 1 To $folder[0]
			$folder[$i] = $drive & "\" & $folder[$i]
			If Not FileExists($folder[$i]) Then
				DirCreate($folder[$i])
			Else
				DirRemove($folder[$i], 1)
				DirCreate($folder[$i])
			EndIf
		Next
	EndIf
	$folder_1 = $folder[1]
	$folder_2 = $folder[2]
	$folder_3 = $folder[3]
;	$folder_4 = $folder[4]
;	$folder_5 = $folder[5]
;	$folder_6 = $folder[6]
;	$folder_7 = $folder[7]
;	$folder_8 = $folder[8]
EndFunc   ;==>SubFunction_TEMPSpace_Create
;===================================================================================================
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
Astel064
Монтирование временного диска чтобы выполнять на нём что-то

RamBoot на основе vdk.exe
RamBoot на основе imdisk

ещё пример GUI
Код:
;  @AZJIO  2010.09.16
#NoTrayIcon ;скрыть в системной панели индикатор AutoIt

; начало создания окна, вкладок, кнопок.
GUICreate("Управление imdisk",328,233) ; размер окна
GUISetBkColor (0xF9F9F9)
$StatusBar = GUICtrlCreateLabel('Строка состояния			AZJIO 2010.09.16', 5, 233-20, 320, 20)


GUICtrlCreateGroup('', 3, -2, 323, 156)
$Check1=GUICtrlCreateRadio("Увеличить диск на", 10,10,120,22)
GUICtrlSetTip(-1, "Увеличить диск B: на"&@CRLF&"указанный размер.")
$combo_imdram1=GUICtrlCreateCombo ("", 140,10,60,18)
GUICtrlSetData(-1,'30|100|300|600|900|1200', '300')
GUICtrlCreateLabel ("Мб", 205,14,20,22)

$bykvadicka80=GUICtrlCreateCombo ("", 260, 10,60,18)
_FindDrive()

$bykvadicka080=GUICtrlRead ($bykvadicka80)
If $bykvadicka080 <> '' Then
	GUICtrlSetData($StatusBar, 'Диск '&$bykvadicka080&' = '&Ceiling(DriveSpaceTotal($bykvadicka080&"\" ))&' Мб			AZJIO 2010.09.16')
EndIf

$free=GUICtrlCreateCombo ("", 260, 70,60,18)
_freeDrive()

$Check2=GUICtrlCreateRadio("Создать диск", 10, 40,110,22)
GUICtrlSetTip(-1, "Создать виртуальный диск в памяти"&@CRLF&"указанного размера (NTFS).")
$combo_imdram2=GUICtrlCreateCombo ("", 140,40,60,18)
GUICtrlSetData(-1,'30|100|300|600|900|1200', '300')
GUICtrlCreateLabel ("Мб", 205,44,20,22)

$Check3=GUICtrlCreateRadio("Создать диск", 10,70,110,22)
GUICtrlSetTip(-1, "Создать виртуальный диск в памяти"&@CRLF&"указанного в процентах размера"&@CRLF&"от свободной памяти, (NTFS).")
$combo_imdram3=GUICtrlCreateCombo ("", 140,70,60,18)
GUICtrlSetData(-1,'10|20|30|40|50|60|70|80|90', '30')
GUICtrlCreateLabel ("%", 205,74,20,22)

$Check4=GUICtrlCreateRadio("Создать диск (-)", 10,100,110,22)
GUICtrlSetTip(-1, "Создать виртуальный диск в памяти"&@CRLF&"оставив свободной памяти указанный размер, (NTFS).")
$combo_imdram4=GUICtrlCreateCombo ("", 140,100,60,18)
GUICtrlSetData(-1,'30|100|300|600|900|1200', '300')
GUICtrlCreateLabel ("Мб", 205,104,20,22)

$ChIMG=GUICtrlCreateRadio("Смонтировать образ IMG", 10,130,170,22)
$ChRW=GUICtrlCreateCheckbox("RW", 180,130,40,22)
GUICtrlSetTip(-1, "Смонтировать образ IMG"&@CRLF&"чтение/запись.")

$start0=GUICtrlCreateButton ("Выполнить", 227, 120, 93, 29)
GUICtrlSetTip(-1, "Выполнить отмеченные опреации")

GUICtrlCreateGroup('Диалоги', 7, 154, 208, 53)
$start12=GUICtrlCreateButton ("Монтировать", 16, 174, 93, 29)
GUICtrlSetTip(-1, "Старт диалога"&@CRLF&"монтирования образа.")
$start11=GUICtrlCreateButton ("imdisk", 115, 174, 93, 29)
GUICtrlSetTip(-1, "Старт диалога управления"&@CRLF&"смонтированными дисками.")

GUISetState ()

While 1
	$msg = GUIGetMsg()
	Select
		Case $msg = $start11
		   Run(@Comspec & ' /C '&@SystemDir&'\imdisk.cpl', '', @SW_HIDE)
		Case $msg = $start12
		   Run(@Comspec & ' /C '&@SystemDir&'\rundll32.exe imdisk.cpl,RunDLL_MountFile', '', @SW_HIDE)
		   
		Case $msg = $bykvadicka80
			$bykvadicka080=GUICtrlRead ($bykvadicka80)
			GUICtrlSetData($StatusBar, 'Диск '&$bykvadicka080&' = '&Ceiling(DriveSpaceTotal($bykvadicka080&"\" ))&' Мб')
		   
		Case $msg = $start0
			GUICtrlSetData($StatusBar, '')
			$bykvadicka080=StringMid(GUICtrlRead ($bykvadicka80), 1,1)
			$free0=GUICtrlRead ($free)
			$list=''
			If $free0 = 'auto' Then
				$free0 = '#'
				$DrivesArr = DriveGetDrive( "all" )
				For $i=1 To $DrivesArr[0]
				   $list&=$DrivesArr[$i]
				Next
			 EndIf
			If GUICtrlRead ($Check1) = 1 Then
				$Size080=DriveSpaceTotal( $bykvadicka080&":\" )
			   RunWait ( @Comspec & ' /C '&@SystemDir&'\imdisk.exe -e -s '&GUICtrlRead ($combo_imdram1)&'M -m '&$bykvadicka080&':', '', @SW_HIDE )
				$Size081=DriveSpaceTotal( $bykvadicka080&":\" )
				If $Size081>$Size080 Then GUICtrlSetData($StatusBar, 'Диск увеличился с '&Ceiling($Size080)&' до '&Ceiling($Size081))
			 EndIf
			If GUICtrlRead ($Check2) = 1 Then
			   RunWait ( @Comspec & ' /C '&@SystemDir&'\imdisk.exe -a -s '&GUICtrlRead ($combo_imdram2)&'M -m '&$free0&': -p "/fs:ntfs /y /q /v:imdisk', '', @SW_HIDE )
				_sb($free0,$list)
			 EndIf
			If GUICtrlRead ($Check3) = 1 Then
			   RunWait ( @Comspec & ' /C '&@SystemDir&'\imdisk.exe -a -s '&GUICtrlRead ($combo_imdram3)&'% -m '&$free0&': -p "/fs:ntfs /y /q /v:imdisk', '', @SW_HIDE )
				_sb($free0,$list)
			 EndIf
			If GUICtrlRead ($Check4) = 1 Then
			   RunWait ( @Comspec & ' /C '&@SystemDir&'\imdisk.exe -a -s -'&GUICtrlRead ($combo_imdram4)&'M -m '&$free0&': -p "/fs:ntfs /y /q /v:imdisk', '', @SW_HIDE )
				_sb($free0,$list)
			 EndIf
			If GUICtrlRead ($ChIMG) = 1 Then
				$TmpIMGFile = FileOpenDialog("Выбор iso-файла.", @WorkingDir & "", "Образ диска (*.img)", 1 + 4 )
				If @error Then ContinueLoop
				If GUICtrlRead ($ChRW) = 1 Then
					RunWait ( @Comspec & ' /C '&@SystemDir&'\imdisk.exe  -a -t file -m '&$free0&': -f '&$TmpIMGFile, '', @SW_HIDE )
				Else
					RunWait ( @Comspec & ' /C '&@SystemDir&'\imdisk.exe  -a -t file -o ro -m '&$free0&': -f '&$TmpIMGFile, '', @SW_HIDE )
				EndIf
				_sb($free0,$list)
			 EndIf
			 _FindDrive()
			 _freeDrive()
		Case $msg = -3
			ExitLoop
	EndSelect
WEnd

Func _sb($free0,$list)
	If $free0 = '#' Then
		$DrivesArr = DriveGetDrive( "all" )
		For $i=1 To $DrivesArr[0]
		   If Not StringInStr($list, $DrivesArr[$i]) Then $free0=StringUpper(StringTrimRight($DrivesArr[$i],1))
		Next
	EndIf
    If FileExists($free0&':\') Then GUICtrlSetData($StatusBar, 'Диск '&$free0&': , размером '&Ceiling(DriveSpaceTotal($free0&":\" ))&' Мб создан')
EndFunc

Func _FindDrive()
	$DrivesArr = DriveGetDrive( "all" )
	$list=''
	$dr=''
	For $i=1 To $DrivesArr[0]
		If DriveGetType( $DrivesArr[$i]&'\' )='Fixed' And $DrivesArr[$i]<>'X:' And DriveSpaceTotal( $DrivesArr[$i]&"\" )<4096 Then
			Assign('list', $list&'|'&StringUpper($DrivesArr[$i]))
			If $dr='' Then $dr=$i
		EndIf
	Next
	$bykvadicka080=GUICtrlRead ($bykvadicka80)
	If StringInStr($list, $bykvadicka080) Then
		$SetBykva=$bykvadicka080
	Else
		$SetBykva=StringUpper($DrivesArr[$dr])
	EndIf
	
	GUICtrlSendMsg($bykvadicka80, 0x14B, 0, 0)
	If $list='' Then
		GUICtrlSetState($bykvadicka80,  128)
		GUICtrlSetState($Check1,  128)
		GUICtrlSetState($combo_imdram1,  128)
	Else
		StringTrimLeft($list,1)
		GUICtrlSetData($bykvadicka80,$list,$SetBykva)
		GUICtrlSetState($bykvadicka80,  64)
		GUICtrlSetState($Check1,  64)
		GUICtrlSetState($combo_imdram1,  64)
	EndIf
EndFunc

Func _freeDrive()
	$DrivesArr = DriveGetDrive( "all" )
	$list=''
	For $i=1 To $DrivesArr[0]
	   $list&=$DrivesArr[$i]
	Next
	$aList=StringSplit('A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z', ',')
	$listnew='auto'
	For $i=1 To $aList[0]
		If Not StringInStr($list, $aList[$i]) Then $listnew&='|'&$aList[$i]
	Next
	GUICtrlSendMsg($free, 0x14B, 0, 0)
	GUICtrlSetData($free,$listnew,'auto')
EndFunc
 
Автор
Astel064

Astel064

Помог мой пост, ставь +!
Сообщения
276
Репутация
51
Спасибо всем, кто ответил :smile:
Спасибо, что дали направление на софт, который занимается Ram дисками.
В общем, меня взял азарт, и я перевел все команды консольного ImDisk и решил написать функции на AutoIt, чтобы "не париться"

Если кому интересно, то все в архиве (пример использования, перевод, описание): http://f-bit.ru/132840
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
Astel064
Я тоже переводил, но кратко. Надо было наверно сразу выложить. Вот в этой справке.
 
Автор
Astel064

Astel064

Помог мой пост, ставь +!
Сообщения
276
Репутация
51
Хм, я что-то там вообще ничего полезного не нашел :smile:
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
Astel064
Возможно, но на основе этой неполезности были написаны скрипты. И кстати, я оболочку cpl тоже переводил. Но не под самую последнюю версию, так как последняя версия на WinXP лишние вопросы задавала при монтировании.

И inf-файл установки исправил, чтобы меню было на русском и прописывала команды не для всех файлов, а только для файлов-образов. Мы же не собираемся txt монтировать как образ диска.

imdisk_rus.7z - v1.4.2.28 (переведены на русский imdisk.cpl и imdisk.inf) для WinXP. На x64 устанавливаются другие не переведённые файлы, поэтому не тестил, но переводится легко, просто копированием текста из одного imdisk.cpl в другой с помощью ResHacker


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

Astel064
Я вам удивляюсь, вы хоть свой перевод читали, чтобы судить мой перевод, в котором каждая буква проверена на реальных событиях, сначала проверена а потом отписана.
-R Аварийного удаления висел виртуальные диски. Следует использовать только как последнее курорт когда виртуальный диск имеет какую-то проблему, что делает его невозможно отделить его на безопасный путь.
как? как такое возможно?
 
Автор
Astel064

Astel064

Помог мой пост, ставь +!
Сообщения
276
Репутация
51
Хм, а Вы не обратили внимание, что эта "справочная" информация не играет никакой роли, я написал что-то типа UDF для работы с RAM дисками, в файле UDF все необходимое написано и проверено, и в читаемом виде :smile:
Этот файл, в котором Вы нашли этот "бред"

R Аварийного удаления висел виртуальные диски. Следует использовать только как последнее курорт когда виртуальный диск имеет какую-то проблему, что делает его невозможно отделить его на безопасный путь.
по хорошему надо удалить, т.к. это справка к приложению (машинный перевод, о чем предупреждалось) и она не используется для UDF :smile:

В общем, я сам не знаю зачем оставил этот файл (ImDisk Справка.txt), НО для файла UDF (RamDisk.inc) он не нужен. А происхождение этого машинного перевода - чисто для себя, чтобы понять какие функции мне использовать в UDF. Не знаю, как вам по другому объяснить :wacko:


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

Я вам удивляюсь, вы хоть свой перевод читали, чтобы судить мой перевод, в котором каждая буква проверена на реальных событиях, сначала проверена а потом отписана.

Я конечно извинюсь, но Ваш перевод я не судил :smile:
Мы с Вами о разных вещах говорим :smile:
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
Astel064
Если кому интересно, то все в архиве (пример использования, перевод, описание):
как вы написали так я и прочитал и отложил перевод для будущего прочтения.

На счёт UDF, не знаю зачем туда инсталятор вставлять. UDF на основе ком-строки обычно не делают, сама ком-строка является интерфейсом программы. Обычно делают UDF с использованием DLL. То есть изучать ваш UDF тоже самое что изучать команды ком-строки, разницы ни какой. Это ни чем не упрощает работы. Если я посмотрю справку, то с тем же успехом сделаю вызов необходимых мне функций. Это UDF удобна в плане обучения создания функций для себя и ничего больше.

Консольные утилиты как раз чаще всего и являются упрощённой оболочкой управления DLL с командным интерфейсом. Она как бы освобождает пользователя напрягаться с низкоуровневым программированием выделение памяти, указатели и т.д. Обёртывать обёртку ещё раз бесполезное занятие.
 
Автор
Astel064

Astel064

Помог мой пост, ставь +!
Сообщения
276
Репутация
51
Обёртывать обёртку ещё раз бесполезное занятие
С этим я с Вами согласен, но для меня все-же удобнее не запускать из консоли, а указать в скрипте функцию и все :smile:

Я вот про это (например):
Код:
FunctionName ("С:\Папка 1, Пакпка 2\Файл.txt", 1);Мне легче так
RunWait ('Путь\Файл.расш "'&...какой-то путь&'" -z', "...", 0); Чем так


Легче один раз создать что-то типа FunctionName, исправить один раз ошибки, чем каждый раз использовать это '"', где я 100% допущу кучу ошибок, типа поставлю & не в том месте, или лишние ' или "
 
Верх