Что нового

заменить фрагменты в строке на размер файла, взятый из пути слева

saavaage

Знающий
Сообщения
171
Репутация
17
Проблема:
есть строка
C:\pagefile.sys 0 0........D:\pagefile.sys 0 0............

необходимо заменить все "0 0" на размер файла в мегабайтах, полученный из пути, находящегося слева от первого из двух 0, т.е. строка должна принять вид:
C:\pagefile.sys X мб........D:\pagefile.sys Y мб............

Количество символов пути = 15 (если считать справа налево от первого 0)

Понимаю, как сделать для простого единичного
C:\pagefile.sys 0 0

Код:
Local $sInput = "C:\pagefile.sys 0 0"
  Local $sOutput = StringRegExpReplace($sInput, "0 0", Ceiling(FileGetSize(StringLeft($sInput,15))/(1024*1024)))


А как это сделать, если таких фрагментов не один?
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
saavaage
Так подойдёт?
Код:
Dim $aPathInput[2]
$aPathInput[0] = "C:\pagefile.sys 0 0"
$aPathInput[1] = "D:\pagefile.sys 0 0"
For $sPathOut In $aPathInput
    $sResult = StringRegExpReplace($sPathOut, "0 0", Ceiling(FileGetSize(StringLeft($sPathOut,15))/(1024*1024)))
    ConsoleWrite($sResult & @CRLF)
Next
 
Автор
S

saavaage

Знающий
Сообщения
171
Репутация
17
Вопрос в том, что я свою строку получаю из реестра:

RegRead("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management", "PagingFiles"))
Кол-во созданных пользователем своп-файлов может быть n (то есть я не знаю).

Вопрос я так понимаю стоит в создании динамического массива на базе полученной из реестра информации?

Разделить на строки через StringSplit не получилось...

Как это сделать? В принципе массив можно ограничить 10 строками..
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
saavaage [?]
Как это сделать? В принципе массив можно ограничить 10 строками..
Код:
$aPathInput = StringSplit(RegRead("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management", "PagingFiles"), @CRLF, 2)
For $sPathOut In $aPathInput
    $sResult = StringRegExpReplace($sPathOut, "0 0", Ceiling(FileGetSize(StringLeft($sPathOut,15))/(1024*1024)))
    ConsoleWrite($sResult & @CRLF)
Next
 
Автор
S

saavaage

Знающий
Сообщения
171
Репутация
17
итого, получилось такое решение:

Код:
#include <GUIConstantsEx.au3>
#include <Array.au3>


Opt("GUIOnEventMode", 1)

$hMain_GUI = GUICreate("OPPPPP", 619, 442, 189, 122)
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")

$Tab1 = GUICtrlCreateTab(8, 16, 601, 377)
$DriverErrors = GUICtrlCreateTabItem("XXXXXXXXXX")
$Input = GUICtrlCreateInput('', 24, 55, 300, 17)
Dim $aPageArray[1]
$aPathInput = StringSplit(RegRead("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management", "PagingFiles"), @CRLF, 2)
For $sPathOut In $aPathInput
    $sResult = StringRegExpReplace($sPathOut, "0 0", Ceiling(FileGetSize(StringLeft($sPathOut,15))/(1024*1024)))
    _ArrayAdd($aPageArray, $sResult)
Next

GUICtrlSetData($Input, _ArrayToString($aPageArray, " "))

GUICtrlCreateTabItem("")
GUISetState()

While 1
    Sleep(100)
WEnd

Func CLOSEClicked()
  Exit
EndFunc



Спасибо большое Garrett!
Garrett, не проверите на красивость? Мне кажется, что не совсем правильно/просто получилось
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
saavaage [?]
не проверите на красивость?
А в чём заключается красивость, я чего-то не уловил?! :(
Выводить данные в GUI вы можете, как вам нравится и как вам удобно. Вы же для себя делаете! :smile:
 
Автор
S

saavaage

Знающий
Сообщения
171
Репутация
17
просто я сделал вывод данных через массив и затем в строку. Возможно, есть способ сразу вывести в строку без лишних "телодвижений"...
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
saavaage [?]
Возможно, есть способ сразу вывести в строку без лишних "телодвижений"
Можно так:
Код:
$aPathInput = StringSplit(RegRead("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management", "PagingFiles"), @CRLF, 2)
For $sPathOut In $aPathInput
    $sResult &= " " & StringRegExpReplace($sPathOut, "0 0", Ceiling(FileGetSize(StringLeft($sPathOut,15))/(1024*1024)))
Next

GUICtrlSetData($Input, $sResult)
 
Верх