Что нового

Как можно выявить изменения произошедшие на локальном диске

assch

Новичок
Сообщения
166
Репутация
4
Как можно выявить изменения произошедшие на локальном диске после инсталировании
какой нибудь программы (Например добавились какие то папки и файлы ну и в идеале конечно изменения в реестре)
Средствами Autoit это возможно?
 
Автор
A

assch

Новичок
Сообщения
166
Репутация
4
Если скрипт положить рядом с папкой "Program Files" функция отработает нормально и выведет информацию на консоль
и скопирует эти файлы в указанное место ("G:\"), а если вместо Global $File = "Program Files" поставить
Global $File = @ProgramFilesDir или Global $File = "C:\Program Files" например для того чтобы запустить скрипт
из другого места то информация на консоль выводится а вот копирования нет
Не подскажете почему?

Код:
#Include <File.au3>

Global $File = "Program Files"
;Global $File = @ProgramFilesDir
;Global $File = "C:\Program Files"

Array($File)

Func Array($File)

$List = _FileListToArray($File, '*', 1)
    If Not @error Then
	   For $i = 1 To $List[0]
		   
	   $t =  FileGetTime($File & '\' & $List[$i], 1)
	   
	   If $t[0] >=2010  And $t[1] >=8  And $t[2] >=18  And $t[3] >=00   Then
	   
	   ConsoleWrite($File & '\' & $List[$i] & @CR)
	   
	   FileCopy($File & '\' & $List[$i], "G:\" & $File & '\' & $List[$i],8)
	   
	   EndIf
	   
	   Next
    EndIf
$List = _FileListToArray($File, '*', 2)
    If Not @error Then
	   For $i = 1 To $List[0]
	   Array($File & '\' & $List[$i])
       Next
    EndIf

EndFunc
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
assch [?]
а если вместо Global $File = "Program Files" поставитьGlobal $File = @ProgramFilesDir или Global $File = "C:\Program Files" например для того чтобы запустить скрипт из другого места то информация на консоль выводится а вот копирования нет

Потому что @ProgramFilesDir и "C:\Program Files" содержат букву диска - в итоге ты пытаешься копировать, например, C:\Program Files\Alcohol 52\Alcoholx.dll в G:\C:\Program Files\Alcohol 52\Alcoholx.dll.

PS: используй тег "autoit" для вставки кода - так читабельнее.
 
Автор
A

assch

Новичок
Сообщения
166
Репутация
4
Спасибо Redline

Попробую Разобратся.
Не подскажешь как силами Autoit Зафиксировать изменения в реестре?
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
assch сказал(а):
Спасибо Redline

Попробую Разобратся.
Не подскажешь как силами Autoit Зафиксировать изменения в реестре?

К сожалению не работал с реестром через автоит, а так есть утилита бесплатная http://regshot.ru делает снимок реестра , после вносишь какие-либо изменения в систему, например, ставишь программу. И снова делаешь снимок - на выходе измененные или вновь созданные ветви реестра.
Попробуй по аналогии считывать реестр, допустим, в один массив, второй проход - во второй массив. Ну и сравнивай массивы :D - удаляя дубликаты. Но это только идея - реализация за тобой, встроенные функции Автоита работают с конкретными строками реестра, а здесь нужно все ветки считать - придется копать файлы. В Win Xp реестра храниться здесь Windows\System32\Config, успехов :whistle:

Вот покопался на офф форуме может поможет - библиотека для работы с реестром http://www.autoitscript.com/forum/index.php?showtopic=70108

и пример экспорта ветки реестра в файл (обычными средствами файлы реестра неполучиться просмотреть)
Код:
$sRegBranch="HKEY_CURRENT_USER"
$sOutput=@DesktopDir&"\export.reg"
Run(@SystemDir&'\reg.exe export "'&$sRegBranch&'" "'&$sOutput&'"','',@SW_HIDE)
 
Автор
A

assch

Новичок
Сообщения
166
Репутация
4
Отследить появление новых файлов на диске можно например с помощью этой конструкции.
Предварительно подставив в функции FileGetTime интересующие вас время.
Я специально закоментировал эту строчку. Эта конструкция отлавливает даже пустые папки.
Но есть интересная деталь некоторые программы при инсталяции некоторые (Новые) файлы ставят в систему с более ранним сроком создания (Интересно как это у них получается?)
и соответственно эта функция их не отлавливает. Но правда если программа положит эти файлы в только что созданную папку
эта функция их отловит.

Не подскажете как это можно решить?

Код:
#Include <File.au3>
Global $File = "C:\"
Global $Text = ""

Array($File)

$file = FileOpen(@ScriptDir & 'file.txt' ,2)
FileWrite($file, $text)
FileClose($file)
Exit

Func Array($File)
$List = _FileListToArray($File, '*', 0)
    If Not @error Then
	   For $i = 1 To $List[0]
	   $t =  FileGetTime($File & '\' & $List[$i], 1)
	  ; If $t[0] >=2010  And $t[1] >=08  And $t[2] >=22  And $t[3] >=10 And $t[4] >=40  And $t[5] >=00  Then
	   $result = StringTrimLeft($File, 4)
	   $Text &= $File & '\' & $List[$i] & @CRLF
	   ;ConsoleWrite($result & '\' & $List[$i] & @CR)
	   DirCopy($File & '\' & $List[$i], @ScriptDir &  "&Assch&\" & $result & '\' & $List[$i], 1)
	   FileCopy($File & '\' & $List[$i], @ScriptDir &  "&Assch&\" & $result & '\' & $List[$i],8)
	   EndIf
	   Next
    EndIf
$List = _FileListToArray($File, '*', 2)
        If Not @error Then
	       For $i = 1 To $List[0]
	       Array($File & '\' & $List[$i])
           Next
        EndIf
EndFunc
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
assch [?]
Но есть интересная деталь некоторые программы при инсталяции некоторые (Новые) файлы ставят в систему с более ранним сроком создания (Интересно как это у них получается?)и соответственно эта функция их не отлавливает. Но правда если программа положит эти файлы в только что созданную папкуэта функция их отловит. Не подскажете как это можно решить?

Еще вариант решения:
1. Получить весь список файлов до внесения изменений, сохранить его.
2. Внести изменения в систему (у меня дежавю :rofl:), снова получить список файлов.
3. Сравнить списки.

Вот скрипт получения списка файлов с занесением его в массив:
Код:
#include <File.au3>
#include <Array.au3>

Global $aDir[1]

_ArrayAddFileListSubDir($aDir, 'c:\')
_ArrayDisplay($aDir)

; построение файл-листа для папки - автор Amel27
Func _ArrayAddFileListSubDir(ByRef $aGDir, $sPath)
    Local $i = UBound($aGDir), $aLDir = _FileListToArray($sPath, '*')
    _ArrayAddFileList($aGDir, $sPath)
    While $i < UBound($aGDir)
        _ArrayAddFileList($aGDir, $aGDir[$i])
        $i += 1
    WEnd
EndFunc

Func _ArrayAddFileList(ByRef $aGDir, $sPath)
    Local $i, $aLDir = _FileListToArray($sPath, '*')
    If UBound($aGDir, 0) = 1 And UBound($aLDir, 0) = 1 Then
        For $i = 1 To $aLDir[0]
            _ArrayAdd($aGDir, $sPath & '\' & $aLDir[$i])
        Next
    EndIf
EndFunc
 
Автор
A

assch

Новичок
Сообщения
166
Репутация
4
Спасибо Redline за советы.
Я знал об этом способе.
Просто таким образом на сканирование одной только папки "WINDOWS" уходит больше минуты я уж не говорю про весь диск.
Я думал может быть есть другие способы. Например программа "TotalUninstall" на сканирование диска и реестра затрачивает
не больше 10 секунд. Интересно какими алгоритмами она это делает?
В любом случае спасибо за участие, буду рад любой информации.

Если можно не большую подсказку какая функция сравнивает списки и удаляет дубликаты?
Как сравнить две строчки я вроде бы нашёл а вот как сравнить целый список тут у меня затор.
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
assch сказал(а):
Если можно не большую подсказку какая функция сравнивает списки и удаляет дубликаты?
Как сравнить две строчки я вроде бы нашёл а вот как сравнить целый список тут у меня затор.

Да сравнивать массивы построчно - это долго. Но можно загнать всё в хэш, и проделать все мгновенно :ok:

Вот решение с офф форума на основе хэшей:
Код:
#include <array.au3>

Dim $Array1[19] = [1,2,3,4,5,6,7,8,9,10,9,8,7,6,5,4,3,2,1]
Dim $Array2[5] = [1,2,3,4,5]
$Differece = _Diff($Array1, $Array2, 1)
_ArrayDisplay($Differece) ; Shows a count from 1-10 and back down 10-1 without the 1,2,3,4,5


$String1="1,2,3,4,5,6,7,8,9,10,9,8,7,6,5,4,3,2,1"
$String2="6,7,8,9,10"
$Differece = _Diff($String1, $String2, 0, ",")
_ArrayDisplay($Differece) ; Shows a count up 1-10 and without the 6,7,8,9,10



;=================================================
; Function Name:   _Diff($Set1, $Set2 [, $GetAll=0 [, $Delim=Default]])
; Description::    Find values in $Set1 that do not occur in $Set2
; Parameter(s):    $Set1    set 1 (1D-array or delimited string)
;                  $Set2    set 2 (1D-array or delimited string)
;      optional:   $GetAll  0 - only one occurence of every difference are shown (Default)
;                           1 - all differences are shown, allowing duplicates
;      optional:   $Delim   Delimiter for strings (Default use the separator character set by Opt("GUIDataSeparatorChar") )
; Return Value(s): Succes   1D-array of values from $Set1 that do not occur in $Set2
;                  Failure  -1  @error  set, that was given as array, isn't 1D-array
; Note:            Comparison is case-sensitive! - i.e. Number 9 is different to string '9'!
; Author(s):       BugFix ([email protected]) Modified by ParoXsitiC for Faster _Diff (Formally _GetIntersection)
;=================================================
Func _Diff(ByRef $Set1, ByRef $Set2, $GetAll = 0, $Delim = Default)
    Local $o1 = ObjCreate("System.Collections.ArrayList")
    Local $o2 = ObjCreate("System.Collections.ArrayList")
    Local $oUnion = ObjCreate("System.Collections.ArrayList")
    Local $oDiff1 = ObjCreate("System.Collections.ArrayList")
    Local $oDiff2 = ObjCreate("System.Collections.ArrayList")
    Local $tmp, $i
    If $GetAll <> 1 Then $GetAll = 0
    If $Delim = Default Then $Delim = Opt("GUIDataSeparatorChar")
    If Not IsArray($Set1) Then
        If Not StringInStr($Set1, $Delim) Then
            $o1.Add($Set1)
        Else
            $tmp = StringSplit($Set1, $Delim, 1)
            For $i = 1 To UBound($tmp) - 1
                $o1.Add($tmp[$i])
            Next
        EndIf
    Else
        If UBound($Set1, 0) > 1 Then Return SetError(1, 0, -1)
        For $i = 0 To UBound($Set1) - 1
            $o1.Add($Set1[$i])
        Next
    EndIf
    If Not IsArray($Set2) Then
        If Not StringInStr($Set2, $Delim) Then
            $o2.Add($Set2)
        Else
            $tmp = StringSplit($Set2, $Delim, 1)
            For $i = 1 To UBound($tmp) - 1
                $o2.Add($tmp[$i])
            Next
        EndIf
    Else
        If UBound($Set2, 0) > 1 Then Return SetError(1, 0, -1)
        For $i = 0 To UBound($Set2) - 1
            $o2.Add($Set2[$i])
        Next
    EndIf
    For $tmp In $o1
        If $o2.Contains($tmp) And Not $oUnion.Contains($tmp) Then $oUnion.Add($tmp)
    Next
    For $tmp In $o1
        If $GetAll Then
            If Not $oUnion.Contains($tmp) Then $oDiff1.Add($tmp)
        Else
            If Not $oUnion.Contains($tmp) And Not $oDiff1.Contains($tmp) Then $oDiff1.Add($tmp)
        EndIf
    Next


    If $oDiff1.Count <= 0 Then Return 0

    Local $aOut[$oDiff1.Count]
    $i = 0
    For $tmp In $oDiff1
        $aOut[$i] = $tmp
        $i += 1
    Next
    Return $aOut
EndFunc   ;==>_Diff

Вот здесь более быстрая функция вывода структуры папок
 
Автор
A

assch

Новичок
Сообщения
166
Репутация
4
С помощью этой быстрой функции список файлов на диске С получился и записался в текстовый файл
за одну секунду если быть точным Time: 1.185 :ok: получилось 22000 строк тоесть 22000 файлов
Если проинсталировать какую нибудь програмку то получится например 22100 строк.
Всё это делается очень даже очень быстро. А вот как получить текстовый файл со списком только что
ставших на диск С ,с этим проблема. По поводу совета использовать Хеши и примером выше,
по эксперементировать не удалось у меня этот код выдаёт ошибку.

решение с офф форума на основе хэшей:

Выдаёт ошибку
$o1.Add($Set1[$i])
$o1^ ERROR

Код который снимает снимок с диска С и пишет результаты в файл

Код:
#Include <File.au3>

Global $Array = ""

_FindFiles('C:', '*')

$Txt = FileOpen('1.txt' ,2)

FileWrite($Txt, $Array)
FileClose($Txt)

Func _FindFiles($sRoot, $sFile)

    Local $FileList

    $FileList = _FileListToArray($sRoot, $sFile, 0)
	
    If Not @error Then
        For $i = 1 To $FileList[0]
           
			$Array &= $sRoot & '\' & $FileList[$i] & @CRLF
		Next
    EndIf
	
    $FileList = _FileListToArray($sRoot, '*', 2)
    If Not @error Then
        For $i = 1 To $FileList[0]
            _FindFiles($sRoot & '\' & $FileList[$i], $sFile)
        Next
    EndIf

EndFunc
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
Хмммм у меня ошибок не выдает, похоже ты пытаешься записать в хэш пустое значение.

Вот смотри рабочий пример - считываем структуру папки скриптов по маске *.txt, что бы лист покороче получился. Копируем в папку скриптов файл 1.txt, для изменения структуры. Снова считываем структуру и сравниваем!
Важное замечание: сравнивать нужно второй массив с первым, если количество файлов увеличилось, а если файлов стало меньше - первый со вторым, поиграйся с копированием и перемещением файла что бы понять смысл :D.

Код:
#Include <File.au3>
#include <Array.au3>

$aReturn = _FileSearch(@ScriptDir, '*.txt')
_ArrayDisplay($aReturn)
;~ $Txt = FileOpen('1.txt' ,2)
;~ _FileWriteFromArray($Txt, $aReturn)
;~ FileClose($Txt)
;~ Sleep(1000)
FileCopy('c:\1.txt', @ScriptDir) ; добавляем новый файлик
;~ FileMove(@ScriptDir&'\1.txt','c:\',1) ; убираем файл
Sleep(1000)
$aReturn_2 = _FileSearch(@ScriptDir, '*.txt')
_ArrayDisplay($aReturn_2)

$Differece = _Diff($aReturn_2, $aReturn) ; первое сравнение при увеличении количества файлов
_ArrayDisplay($Differece)
$Differece_2 = _Diff($aReturn, $aReturn_2) ; второе сравнение при уменьшении количества файлов
_ArrayDisplay($Differece_2)

;$iFlag = 0 - Файлы и папки (по умолчанию)
;$iFlag = 1 - Только файлы
;$iFlag = 2 - Только папки
Func _FileSearch($sPath, $sFileMask, $iFlag = 0)
    Local $sOutBin, $sOut, $aOut, $sRead, $hDir, $sAttrib

    Switch $iFlag
        Case 1
            $sAttrib = ' /A-D'
        Case 2
            $sAttrib = ' /AD'
        Case Else
            $sAttrib = ' /A'
    EndSwitch

    $sOut = StringToBinary('0' & @CRLF, 2)
    $aMasks = StringSplit($sFileMask, ';')

    For $i = 1 To $aMasks[0]
        $hDir = Run(@ComSpec & ' /U /C DIR "' & $sPath & '\' & $aMasks[$i] & '" /S /B' & $sAttrib, @SystemDir, @SW_HIDE, 6)

        While 1
            $sRead = StdoutRead($hDir, False, True)

            If @error Then
                ExitLoop
            EndIf

            If $sRead <> "" Then
                $sOut &= $sRead
            EndIf
        Wend
    Next

    $aOut = StringRegExp(BinaryToString($sOut, 2), '[^\r\n]+', 3)

    If @error Then
        Return SetError(1)
    EndIf

    $aOut[0] = UBound($aOut)-1
    Return $aOut
EndFunc

;=================================================
; Function Name:   _Diff($Set1, $Set2 [, $GetAll=0 [, $Delim=Default]])
; Description::    Find values in $Set1 that do not occur in $Set2
; Parameter(s):    $Set1    set 1 (1D-array or delimited string)
;                  $Set2    set 2 (1D-array or delimited string)
;      optional:   $GetAll  0 - only one occurence of every difference are shown (Default)
;                           1 - all differences are shown, allowing duplicates
;      optional:   $Delim   Delimiter for strings (Default use the separator character set by Opt("GUIDataSeparatorChar") )
; Return Value(s): Succes   1D-array of values from $Set1 that do not occur in $Set2
;                  Failure  -1  @error  set, that was given as array, isn't 1D-array
; Note:            Comparison is case-sensitive! - i.e. Number 9 is different to string '9'!
; Author(s):       BugFix ([email protected]) Modified by ParoXsitiC for Faster _Diff (Formally _GetIntersection)
;=================================================
Func _Diff(ByRef $Set1, ByRef $Set2, $GetAll = 0, $Delim = Default)
    Local $o1 = ObjCreate("System.Collections.ArrayList")
    Local $o2 = ObjCreate("System.Collections.ArrayList")
    Local $oUnion = ObjCreate("System.Collections.ArrayList")
    Local $oDiff1 = ObjCreate("System.Collections.ArrayList")
    Local $oDiff2 = ObjCreate("System.Collections.ArrayList")
    Local $tmp, $i
    If $GetAll <> 1 Then $GetAll = 0
    If $Delim = Default Then $Delim = Opt("GUIDataSeparatorChar")
    If Not IsArray($Set1) Then
        If Not StringInStr($Set1, $Delim) Then
            $o1.Add($Set1)
        Else
            $tmp = StringSplit($Set1, $Delim, 1)
            For $i = 1 To UBound($tmp) - 1
                $o1.Add($tmp[$i])
            Next
        EndIf
    Else
        If UBound($Set1, 0) > 1 Then Return SetError(1, 0, -1)
        For $i = 0 To UBound($Set1) - 1
            $o1.Add($Set1[$i])
        Next
    EndIf
    If Not IsArray($Set2) Then
        If Not StringInStr($Set2, $Delim) Then
            $o2.Add($Set2)
        Else
            $tmp = StringSplit($Set2, $Delim, 1)
            For $i = 1 To UBound($tmp) - 1
                $o2.Add($tmp[$i])
            Next
        EndIf
    Else
        If UBound($Set2, 0) > 1 Then Return SetError(1, 0, -1)
        For $i = 0 To UBound($Set2) - 1
            $o2.Add($Set2[$i])
        Next
    EndIf
    For $tmp In $o1
        If $o2.Contains($tmp) And Not $oUnion.Contains($tmp) Then $oUnion.Add($tmp)
    Next
    For $tmp In $o1
        If $GetAll Then
            If Not $oUnion.Contains($tmp) Then $oDiff1.Add($tmp)
        Else
            If Not $oUnion.Contains($tmp) And Not $oDiff1.Contains($tmp) Then $oDiff1.Add($tmp)
        EndIf
    Next


    If $oDiff1.Count <= 0 Then Return 0

    Local $aOut[$oDiff1.Count]
    $i = 0
    For $tmp In $oDiff1
        $aOut[$i] = $tmp
        $i += 1
    Next
    Return $aOut
EndFunc   ;==>_Diff
 
Автор
A

assch

Новичок
Сообщения
166
Репутация
4
Вот что получилось с большой помощью Redline

Функция которая ищет добавленные (и удалённые) строки в двух текстовых файлах
и записывает информацию в текстовые файлы

Код:
#Include <File.au3>
#include <Array.au3>

Global $Test1 = "Test1.txt"
Global $Test2 = "Test2.txt"
Global $aReturn
Global $aReturn_2
Global $sFilePath1 = '1.txt'
Global $sFilePath2 = '2.txt'
_FileReadToArray($sFilePath1, $aReturn)
_FileReadToArray($sFilePath2, $aReturn_2)
$Differece1 = _Diff($aReturn_2, $aReturn) ; первое сравнение при увеличении количества файлов
$Differece2 = _Diff($aReturn, $aReturn_2) ; второе сравнение при уменьшении количества файлов
$File1 = FileOpen($Test1, 1) 
FileClose($File1)
_FileWriteFromArray($Test1, $Differece1, 1)   ;записывает в Test1.txt добавленные (разницу) файлы
$File2 = FileOpen($Test2, 1) 
FileClose($File2)
_FileWriteFromArray($Test2, $Differece2, 1)   ;записывает в Test2.txt удалённые  файлы

Func _Diff(ByRef $Set1, ByRef $Set2, $GetAll = 0, $Delim = Default)
    Local $o1 = ObjCreate("System.Collections.ArrayList")
    Local $o2 = ObjCreate("System.Collections.ArrayList")
    Local $oUnion = ObjCreate("System.Collections.ArrayList")
    Local $oDiff1 = ObjCreate("System.Collections.ArrayList")
    Local $oDiff2 = ObjCreate("System.Collections.ArrayList")
    Local $tmp, $i
    If $GetAll <> 1 Then $GetAll = 0
    If $Delim = Default Then $Delim = Opt("GUIDataSeparatorChar")
    If Not IsArray($Set1) Then
        If Not StringInStr($Set1, $Delim) Then
            $o1.Add($Set1)
        Else
            $tmp = StringSplit($Set1, $Delim, 1)
            For $i = 1 To UBound($tmp) - 1
                $o1.Add($tmp[$i])
            Next
        EndIf
    Else
        If UBound($Set1, 0) > 1 Then Return SetError(1, 0, -1)
        For $i = 0 To UBound($Set1) - 1
            $o1.Add($Set1[$i])
        Next
    EndIf
    If Not IsArray($Set2) Then
        If Not StringInStr($Set2, $Delim) Then
            $o2.Add($Set2)
        Else
            $tmp = StringSplit($Set2, $Delim, 1)
            For $i = 1 To UBound($tmp) - 1
                $o2.Add($tmp[$i])
            Next
        EndIf
    Else
        If UBound($Set2, 0) > 1 Then Return SetError(1, 0, -1)
        For $i = 0 To UBound($Set2) - 1
            $o2.Add($Set2[$i])
        Next
    EndIf
    For $tmp In $o1
        If $o2.Contains($tmp) And Not $oUnion.Contains($tmp) Then $oUnion.Add($tmp)
    Next
    For $tmp In $o1
        If $GetAll Then
            If Not $oUnion.Contains($tmp) Then $oDiff1.Add($tmp)
        Else
            If Not $oUnion.Contains($tmp) And Not $oDiff1.Contains($tmp) Then $oDiff1.Add($tmp)
        EndIf
    Next


    If $oDiff1.Count <= 0 Then Return 0

    Local $aOut[$oDiff1.Count]
    $i = 0
    For $tmp In $oDiff1
        $aOut[$i] = $tmp
        $i += 1
    Next
    Return $aOut
EndFunc


И так две функции уже есть
одна делает быстрые снимки файловой системы
другая находит изменения
Осталось в плотную заняться снимками и выявлением изменений в реестре :beer:
 
Автор
A

assch

Новичок
Сообщения
166
Репутация
4
решение с офф форума на основе хэшей:

У меня выдавала ошибку
$o1.Add($Set1[$i])
$o1^ ERROR

Я нашёл почему.
Для тестов я часто ставлю чистую систему с помощью ранее сделанного снимка и Акрона - 5 минут и всё.
Так вот на том снимке - Чистая Винда и плюс некоторые необходимые программки в том числе и Autoit.
А Framework не установлен, а без него функция на основе хэшей почему то выдаёт ошибку.
Как только ставишь Framework всё начинает работать. Даже если сделать корректно у этой функции экзешник с установленным Framework ,то всё равно этот экзешник без Framework работать не будет.
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
assch [?]
А Framework не установлен, а без него функция на основе хэшей почему то выдаёт ошибку.Как только ставишь Framework всё начинает работать. Даже если сделать корректно у этой функции экзешник с установленным Framework ,то всё равно этот экзешник без Framework работать не будет.

И правда, порыл интернет - сам класс System.Collections появился в Framework v2.0.
Моя ошибка в том что System.Collections.ArrayList - это уже не хэш ;), а просто массив и в нем могут содержаться повторяющиеся значения. Т.е. ошибка только в названии.
А вообще очень полезная вещь System.Collections.ArrayList и сортировать может в любом порядке, и удалить любой элемент без перебора всего списка, все возможности можно тут глянуть - http://msdn.microsoft.com/ru-ru/library/system.collections.arraylist_members.aspx
 
Верх