<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; VBScript: IMAPI + IBurnVerification Interface]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=4142</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=4142&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «VBScript: IMAPI + IBurnVerification Interface».]]></description>
		<lastBuildDate>Thu, 25 Feb 2010 10:28:13 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: VBScript: IMAPI + IBurnVerification Interface]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=33337#p33337</link>
			<description><![CDATA[<p>Вот скрипт на проверку записи. Кода правда вышло несколько больше десятка строк, но функционала прикрепления файла я не наблюдаю(наверное прав маловато <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" />), а на файлопомойку заливать смысла не вижу (~23k в чистом виде или ~6k в зипе).</p><p>Краткое описание: делает список содержимого двух папок, потом сверяет их размеры. Если всё сошлось, читает попарно файлы из обоих папок и сравнивает по содержимому (порция считываемая за раз настраивается - думаю не сильно ошибусь если скажу что число байт соответствует числу символов в ASCII). Результаты сравнения сводит в таблицу(можно экспортировать в файл с разделителем &quot;;&quot;). В зависимости от настроек, по результатам проверки чистит исходную папку от удачно записанных файлов(по умолчанию отключено).</p><p>Лог файлы перезаписываются(если нужно дописывать, просто надо поменять режим открытия ссответсвующего файла в функции check_params - дополнительные параметры под это вводить не стал).</p><p>Все настройки в начале файла до описания работы. Коментариев возможно многовато, но писал так чтобы потом сам мог вспомнить что здесь и как <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p><div class="codebox"><pre><code>&#039; VB Script Document
Option Explicit

&#039; если не сказано иное, то 1 значит &quot;включено&quot;, 0 - &quot;выключено&quot;

Dim log2console, log2file, logrez2file, interactive
log2console = 1 &#039; вывод информации в консоль (1/0)
log2file = 1    &#039; вывод информации в файл (1/0)
logrez2file = 1 &#039; вывод результата проверки в файл (1/0)
interactive = 1 &#039; включить запросы пользователю? (1/&lt;&gt;1)

Dim Path2CopyFrom, Path2CopyTo, CompLogFile, CompRezLogFile, DelFiles, ForceDel
Path2CopyFrom = &quot;c:\!2Burn\2.2&quot; &#039; папка-источник
Path2CopyTo = &quot;d:\&quot;  &#039; папка назначения
CompLogFile = &quot;c:\!2Burn\compare.log&quot; &#039; логфайл
CompRezLogFile =  &quot;c:\!2Burn\compare_result.csv&quot; &#039; результат сравнения
DelFiles = 0  &#039; очистка исходной папки
              &#039; 0 - не очищать
              &#039; 1 - очищать от удачно записанных файлов
              &#039; 2 - очищать только при удачной записи ВСЕХ файлов
ForceDel = 0  &#039; принудительное удаление файлов и папок (1/0)
  

Dim ReadSize 
ReadSize = 10 &#039; Mb, порция при чтении файлов для сравнения - при очень маленькой 
              &#039; диск иногда останавливается(чтение из буфера) =&gt; потери времени
              &#039; на повторных раскрутках диска

&#039; общее описание работы:
&#039; 1. индексируется содержимое исходной и конечной папки (данные заносятся в 
&#039;    массивы SrcFileNames() и TargtFileNames())              
&#039; 2. проверяется наличие файлов и их размеров (результаты заносятся в массив 
&#039;    SrcFileNames())
&#039; 3. если размеры совпадают, то проверяется сходность содержимого -
&#039;    читается по куску из каждого файла и сравнивается (результаты заносятся в 
&#039;    массив SrcFileNames())
&#039; 4. далее в зависимости от настроек производится очистка исходной папки от тех
&#039;    файлов что прошли проверку и от пустых папок

&#039; результат работы представлен в виде массива
&#039; &quot;путь&quot; - относительный
&#039;i: 0         1         2         3             4             5
&#039;=======================================================================
&#039; path |filename   |  Size  |  IsOnDisk  | IsSameSize  | IsSameContent |
&#039;=======================================================================
&#039; ASJ  |filename1  |  123b  |     1      |       1     |          1    |
&#039;------|-----------|--------|------------|-------------|---------------|
&#039; ASJ  |filename2  |  123b  |     1      |       1     |          1    |
&#039;------|-----------|--------|------------|-------------|---------------|
&#039; ASJ  |filename3  |  123b  |     1      |       1     |          1    |
&#039;------|-----------|--------|------------|-------------|---------------|
&#039; ASJ  |filename4  |  123b  |     1      |       1     |          1    |
&#039;=======================================================================

Const ForReading = 1, ForWriting = 2, ForAppending = 8
Const f_ASCII = 0, f_Unicode = -1, f_Default = -2 

Dim TotalTimerStart
TotalTimerStart = timer &#039; засекаем общее время выполнения

Dim fso
Set fso = CreateObject(&quot;Scripting.FileSystemObject&quot;)

Dim oCompLogFile, oCompRezLogFile

check_params() &#039; проверяем исходные пути

Dim SrcFileNames(), TargtFileNames() &#039; объявляем динамические массивы для папок
&#039; в Dim не даёт указать размер с переменной, а безразмерный массив в цикле 
&#039; не заполняется. поэтому:
ReDim SrcFileNames(6,0), TargtFileNames(6,0) &#039; задаём предварительный размер
&#039; массив получается транспонированый по сравнению с табличкой в пояснении, т.к.
&#039; ReDim переразмеривает только последний размер

If CheckSession(Path2CopyFrom, Path2CopyTo) = true Then
    call MakeLog(&quot;Проверка завершена. Запись была успешна.&quot;)

    If DelFiles = 2 Then
      MakeLog(&quot;Включена очистка исходной папки от файлов. Начинаю очистку.&quot;)
      call ClearPath1(SrcFileNames, Path2CopyFrom, DelFiles)
    End If

  Else

    call MakeLog(&quot;Проверка завершена. Часть файлов записались не корректно.&quot;)

    If DelFiles = 1 Then
      MakeLog(&quot;Включена очистка исходной папки от удачно записанных файлов. Начинаю очистку.&quot;)
      If interactive = 1 Then
          Dim a
          a = MsgBox(&quot;Включена очистка папки-источника! Подтверждаете необходимость очистки?&quot;, vbYesNo + vbExclamation, &quot;ВНИМАНИЕ!!!&quot;)
          Select Case a
            case 6 
              call ClearPath1(SrcFileNames, Path2CopyFrom, DelFiles)
            case 7
              MakeLog(&quot;Очитка исходной папки отменена пользователем.&quot;)
          End Select
        Else
          call ClearPath1(SrcFileNames, Path2CopyFrom, DelFiles)
      End If
    End If
end If
call MakeLog(&quot;Общее время проверки: &quot; &amp; Round(timer - TotalTimerStart, 2) &amp; &quot; сек.&quot;)

If logrez2file = 1 Then
  call print_arr(SrcFileNames, 1)
end If

&#039;*******************************************************************************
&#039;********************** Проверка результатов записи ****************************
&#039;*******************************************************************************
Function CheckSession(path1, path2) &#039; path1 - источник, path2 - копия

  &#039; сначала индексируем папку-источник
  Call EnumFolderContent(path1, SrcFileNames, 0, true)  
  If log2console = 1 Then
    Call print_arr(SrcFileNames, 0)
  End If

  Call MakeLog(&quot;&lt;=========================================================================&gt;&quot;)

  &#039; потом индексируем болванку (целевую папку)
  Call EnumFolderContent(path2, TargtFileNames, 0, false) 
  If log2console = 1 Then
    Call print_arr(TargtFileNames, 0)
  End If
  
  &#039; получили два массива содержащих относительный путь, имя файла и его размер
  &#039; теперь нужно сравнить содержимое исходной и конечной папки
  If FolderComp(SrcFileNames, TargtFileNames) = true Then &#039; сравним содержимое папок(массивов)
    CheckSession = true
    Else
    CheckSession = false
  End If
End Function

&#039;*******************************************************************************
&#039;********************** Сравнение содержимого папок ****************************
&#039;*******************************************************************************
Function FolderComp(ByRef arr1(), ByRef arr2())
&#039;call MakeLog(&quot;--------------------------------------------------------------------------------&quot;)
&#039;call MakeLog(&quot;size1 = &quot; &amp; ubound(SrcFileNames,2) &amp; &quot;; size2 = &quot; &amp; ubound(TargtFileNames,2))
  
&#039; сравниваем файлы
  Dim j, s3, s4, s5
  s3 = 0 &#039; сумма по столбцу IsOnDisk
  s4 = 0 &#039; сумма по столбцу IsSameSize
  s5 = 0 &#039; сумма по столбцу IsSameContent
  &#039; если сумма не совпадёт с числом строк, то при записи были ошибки

  Dim err1, i
  err1 = 0  

  For i = 0 to ubound(arr1, 2)-1 &#039; листаем папку-источник
    call MakeLog(&quot;--------------------------------------------------------------------------------&quot;)
    For j=0 to ubound(arr2, 2)-1 &#039; листаем папку-приёмник
&#039;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;
&#039; проверяем по именам файлов
      If arr1(0,i) = arr2(0,j) and arr1(1,i) = arr2(1,j)  Then
        call MakeLog(&quot;[&quot; &amp; arr1(0,i) &amp; &quot;\&quot; &amp; arr1(1,i) &amp; &quot;] на болванке найден...&quot;)
        arr1(3,i) = 1 &#039; проверка пройдена успешно
  &#039;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;
  &#039; проверяем по размерам файлы с совпадающими именами      
          If arr1(2,i) = arr2(2,j) Then
            call MakeLog(&quot;... размер совпадает&quot;)
            arr1(4,i) = 1 &#039; проверка пройдена успешно
    &#039;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;
    &#039; сравниваем побайтово
    Dim f1, f2
        f1 = ClearPath(Path2CopyFrom) &amp; &quot;\&quot; &amp; arr1(0,i) &amp; &quot;\&quot; &amp; arr1(1,i)
        f2 = ClearPath(Path2CopyTo) &amp; &quot;\&quot; &amp; arr2(0,j) &amp; &quot;\&quot; &amp; arr2(1,j)
              If FilesComp(f1, f2, ReadSize*1024*1024) = true Then
                  call MakeLog(&quot;Файлы идентичны&quot;)
                  arr1(5,i) = 1 &#039; проверка пройдена успешно
                  Exit For
                Else
                  call MakeLog(&quot;Файлы различаются&quot;)
                  arr1(5,i) = 0 &#039; просто чтобы не было пустот :)
                  Exit For
              End If
    &#039;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;              
            Else
              arr1(4,i) = 0 &#039; проверка размера не пройдена
              call MakeLog(&quot;... размер не совпадает&quot;)
              arr1(5,i) = 0 &#039; просто чтобы не было пустот :)
              Exit For  
          End If
  &#039;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;
        Else
          arr1(3,i)=0
      End If   
&#039;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;
    Next

  s3 = s3 + arr1(3,i)
  s4 = s4 + arr1(4,i)
  s5 = s5 + arr1(5,i)
  Next
    call MakeLog(&quot;================================================================================&quot;)
    If s3 = ubound(arr1, 2) and s4 = ubound(arr1, 2)  and s5 = ubound(arr1, 2) Then
        call MakeLog(&quot;Проверка завершена: на болванке присутствуют все файлы, размеры файлов правильны, содержание идентично равны.&quot;)
        FolderComp = true
      ElseIf s3 &lt; ubound(arr1, 2) and s4 = ubound(arr1, 2)  and s5 = ubound(arr1, 2) Then
        call MakeLog(&quot;Проверка завершена: на болванке присутствуют не все файлы из источника.&quot;)
      ElseIf s3 = ubound(arr1, 2) and s4 &lt; ubound(arr1, 2)  and s5 = ubound(arr1, 2) Then
        call MakeLog(&quot;Проверка завершена: часть файлов на болванке имеет размер отличный от источника.&quot;)
      ElseIf s3 = ubound(arr1, 2) and s4 = ubound(arr1, 2)  and s5 &lt; ubound(arr1, 2) Then
        call MakeLog(&quot;Проверка завершена: часть файлов на болванке имеет содержание отличное от источника.&quot;)
      Else
        call MakeLog(&quot;Проверка завершена: в результатах записи выявлены различные ошибки.&quot;)
    End If

End Function


&#039;*******************************************************************************
&#039;********************* &quot;Побайтовое&quot; сравнение файлов ***************************
&#039;*******************************************************************************
Function FilesComp(file1, file2, ReadPortionSize) &#039; размер передаётся в байтах

  Dim fo1, fo2, fsize, step_size
    Set fo1=fso.OpenTextFile(file1, ForReading, f_ASCII) &#039;только чтение, формат 
    fsize = fso.GetFile(file1).size   &#039; размер оригинального файла
                                      &#039; по задумке - ранее файлы оказались равного размера
    step_size = ReadPortionSize / fsize &#039; относительный размер куска при чтении 
                                        &#039; длинное
  call MakeLog(&quot;Размер файла = &quot; &amp; Round(fsize/1024/1024, 2) &amp; &quot;Mb&quot;)
  &#039;call MakeLog(&quot;Размер куска = &quot; &amp; ReadPortionSize/1024/1024 &amp; &quot;Mb&quot;)
  &#039;call MakeLog(&quot;Размер куска = &quot; &amp; ReadPortionSize &amp; &quot; символов&quot; &#039; совпадает с числом байтов)
  &#039;call MakeLog(&quot;Относительный размер куска = &quot; &amp; CStr(Round(step_size * 100, 2)) &amp; &quot;%&quot;)
    Set fo2=fso.OpenTextFile(file2, ForReading, f_ASCII) &#039;только чтение, формат
    
    
  Dim Str1, Str2, i, cur_size, ReadIt
    Str1 = &quot;&quot;
    Str2 = &quot;&quot;
    i = 0
    cur_size = 0
    call MakeLog(&quot;Начинаю сравнение:&quot;)
  Dim StartTime, EndTime, StepStartTime
    StartTime = Timer &#039; засекаем общее время выполнения сравнения
    Do While Not fo1.AtEndOfStream   
      StepStartTime = Timer &#039; засекаем время выполнения шага
      If cur_size * 1024 * 1024 + ReadPortionSize &lt; fsize Then
          ReadIt = ReadPortionSize
        Else
          ReadIt = fsize - cur_size * 1024 * 1024
      End If
        Str1 = fo1.Read(ReadIt)
        Str2 = fo2.Read(ReadIt)
        
      If StrComp(Str1, Str2, vbBinaryCompare) = 0 Then 
          i = i + 1
          cur_size = cur_size + ReadIt/1024/1024
          call MakeLog(i &amp; &quot;. &quot; &amp; Percent2Str(cur_size*1024*1024/fsize) &amp; &quot; @ dT=&quot; &amp; Round(Timer - StepStartTime, 2) &amp; &quot;c =&gt; OK. Done &quot; &amp; Round(cur_size,2) &amp; &quot;Mb from &quot; &amp; Round(fsize/1024/1024, 2) &amp; &quot;Mb&quot;)
          FilesComp = true
        Else
          call MakeLog(Percent2Str(cur_size*1024*1024/fsize) &amp; &quot; @ dT=&quot; &amp; Round(Timer - StepStartTime, 2) &amp; &quot;c =&gt; файлы не совпадают&quot;)
          FilesComp = false
          Exit Do
      End If
&#039; ограничитель цикла (для отладки - поставить нужное положительное)
      If i = -200 Then
        Exit Do
      End If
    Loop
  EndTime = Timer
  call MakeLog(&quot;Затраченное время: &quot; &amp; EndTime - StartTime &amp; &quot; сек.&quot;)  
End Function
&#039;*******************************************************************************
&#039;********************** формирование строки процентов **************************
&#039;*******************************************************************************
Function Percent2Str(number)
&#039; вдруг захочется ещё отформатировать вывод :) - чтобы править в одном месте
  Percent2Str = FormatPercent(number, 2, -1)
End Function


&#039;*******************************************************************************
&#039;********************** Формирование списка фалов ******************************
&#039;*******************************************************************************
Sub EnumFolderContent(path2enum, ByRef arr(), i, IsPath1)
&#039; параметры в порядке следования:
&#039; путь для обработки(строка)
&#039; массив для заполнения(сюда название)
&#039; последний индекс файла (для сквозной нумерации для вывода в консоль)(целое)
&#039; признак папки-источника или конечной папки - для &quot;сборки&quot; полного пути к файлу(булево)


&#039; заполняем массив, описывающие содержимое папки поля:
&#039; 0 - путь относительно корневой папки(Path2CopyFrom или Path2CopyTo)
&#039; 1 - имя файла
&#039; 2 - размер файла(байт)
&#039; 3, 4, 5 - заполняются при сравнении файлов
path2enum = ClearPath(path2enum) &#039; чистим путь

  Dim fldr, files, folders
  Set fldr = fso.GetFolder(path2enum)
  Set files = fldr.Files &#039; список файлов
  Set folders = fldr.SubFolders &#039; список подпапок
  ReDim Preserve arr(6, UBound(arr, 2) + files.count) &#039; &quot;раздвигаем&quot; массив под
                                                      &#039; новую порцию файлов

  Dim File
  For Each File in files
    If IsPath1 = true Then &#039; отделяем относительный путь к файлу
      arr(0,i) = ClearPath(Right(ClearPath(fldr.Path), Len(ClearPath(fldr.Path)) - Len(ClearPath(Path2CopyFrom))))
      Else
      arr(0,i) = ClearPath(Right(ClearPath(fldr.Path), Len(ClearPath(fldr.Path)) - Len(ClearPath(Path2CopyTo))))
    End If

    arr(1,i) = File.Name  &#039; имя файла
    arr(2,i) = File.Size  &#039; размер в байтах
    i = i + 1 &#039; просто порядковый номер файла для вывода в консоль
  Next
  Dim Folder
  For Each Folder in folders
    Call EnumFolderContent(Folder, arr, i, IsPath1) &#039; рекурсия :)
  Next
End Sub
&#039;*******************************************************************************
&#039;***************************** Чистка &quot;пути&quot; ***********************************
&#039;*******************************************************************************
Function ClearPath(PathString)
&#039; чистим путь от слэшей в конце и начале (чтобы исключить зависимость от ввода) 
&#039; и направляем их в одну сторону :)
  ClearPath = Trim(PathString)
  ClearPath = Replace(ClearPath, &quot;/&quot;, &quot;\&quot;) &#039; меняем прямые на обратные
  ClearPath = Replace(ClearPath, &quot;\\&quot;, &quot;\&quot;) &#039; избавляемся от двойных слэшей
  If Left(ClearPath, 1) = &quot;\&quot; Then    &#039; убираем слэш слева
    ClearPath = Right(ClearPath, Len(ClearPath)-1)
  End If
  If Right(ClearPath, 1) = &quot;\&quot; Then   &#039; убираем слэш справа
    ClearPath = Left(ClearPath, Len(ClearPath)-1)
  End If
End Function

&#039;*******************************************************************************
&#039;*********************** Вывод содержимого массива *****************************
&#039;*******************************************************************************
sub print_arr(ByRef arr(), is2Save)
&#039; 2Save - если 1, то сохраняем в файл. если 0 - выводим на экран
  Dim m
  for m=0 to ubound(arr,2) - 1
    If log2console = 1 and is2Save = 0 Then
      wscript.echo m &amp; &quot;;&quot; &amp; arr(0,m) &amp; &quot;;&quot; &amp; arr(1,m) &amp; &quot;;&quot; &amp; arr(2,m) &amp; &quot;;&quot; &amp; arr(3,m) &amp; &quot;;&quot; &amp; arr(4,m) &amp; &quot;;&quot; &amp; arr(5,m)
    End If
    If logrez2file = 1  and is2Save = 1 Then
      oCompRezLogFile.WriteLine(arr(0,m) &amp; &quot;;&quot; &amp; arr(1,m) &amp; &quot;;&quot; &amp; arr(2,m) &amp; &quot;;&quot; &amp; arr(3,m) &amp; &quot;;&quot; &amp; arr(4,m) &amp; &quot;;&quot; &amp; arr(5,m))
    End If
  next 
end sub
&#039;*******************************************************************************
&#039;******************** Информирование о ходе процесса ***************************
&#039;*******************************************************************************
sub MakeLog(MessageString)
  If log2console = 1 Then
    wscript.echo MessageString
  End If
  If log2file = 1 Then
    oCompLogFile.WriteLine(MessageString)
  End If
end sub

&#039;*******************************************************************************
&#039;*********************** Очистка папки-источника *******************************
&#039;*******************************************************************************
Sub ClearPath1(ByRef arr(), RootPath, ClearMode)
&#039; arr - массив с результатами проверки
&#039; RootPath - Path2CopyFrom
&#039; ClearMode - режим чистки
&#039; проверяем массив - если все 6-ые равны 1, значит можно тереть всё
&#039; проходим по массиву - если 6-ой элемент равен 1 (удачная проверка)

Dim f, j, DelRez, fold
For j = 0 to ubound(arr, 2)-1
  If arr(5,j) = 1 Then
    MakeLog(&quot;Удаляю файл: &quot; &amp; ClearPath(RootPath &amp; &quot;\&quot; &amp; arr(0,j) &amp; &quot;\&quot; &amp; arr(1,j)))
    On Error Resume Next
    If ForceDel = 1 Then
        &#039;DelRez = 
        fso.DeleteFile ClearPath(RootPath &amp; &quot;\&quot; &amp; arr(0,j) &amp; &quot;\&quot; &amp; arr(1,j)), true
      Else
        &#039;DelRez = 
        fso.DeleteFile ClearPath(RootPath &amp; &quot;\&quot; &amp; arr(0,j) &amp; &quot;\&quot; &amp; arr(1,j)), false
    End If
    
    Select Case Err.Number
      Case 70
        MakeLog(&quot;Не удалось удалить файл [&quot; &amp; ClearPath(RootPath &amp; &quot;\&quot; &amp; arr(0,j) &amp; &quot;\&quot; &amp; arr(1,j)) &amp; &quot;]: Permission denied.&quot;)
      Case 53
        MakeLog(&quot;Не удалось удалить файл [&quot; &amp; ClearPath(RootPath &amp; &quot;\&quot; &amp; arr(0,j) &amp; &quot;\&quot; &amp; arr(1,j)) &amp; &quot;]: File not found.&quot;)
      Case 0
        MakeLog(&quot;Done.&quot;)
      Case Else
        MakeLog(&quot;Не удалось удалить файл [&quot; &amp; ClearPath(RootPath &amp; &quot;\&quot; &amp; arr(0,j) &amp; &quot;\&quot; &amp; arr(1,j)) &amp; &quot;] по причине НЕХ, код ошибки: &quot; &amp; Err.Number)
    End Select
    Else
    MakeLog(&quot;Файл был не корректно записан(удалён не будет): &quot; &amp; ClearPath(RootPath &amp; &quot;\&quot; &amp; arr(0,j) &amp; &quot;\&quot; &amp; arr(1,j)))
  End If
Err.Clear
next
MakeLog(&quot;**************************************************************************&quot;)
&#039; проходим папки - если пустые, трём
Dim fldr, fldr_path, fldr_path_last
fldr_path = &quot;&quot; &#039; текущий путь
fldr_path_last = &quot;&quot; &#039; последний использованный путь
For j = ubound(arr, 2)-1 to 0 step -1 &#039; начинаем с самых глубоких папок
      fldr_path = ClearPath(RootPath &amp; &quot;\&quot; &amp; arr(0,j))
&#039; корневую папку не трогаем, ранее обработанную пропускаем(и на всякий случай проверяем наличие)
  If StrComp(fldr_path, ClearPath(RootPath), 1) &lt;&gt; 0 and _
    fso.FolderExists(fldr_path) and _
    StrComp(fldr_path_last, fldr_path, 1) &lt;&gt; 0 Then 
    set fldr = fso.GetFolder(fldr_path) &#039; получаем ссылку на папку
    MakeLog(&quot;Папка пустая(&quot; &amp; fldr_path &amp; &quot;). Удаляю.&quot;)
    If ForceDel = 1 Then
        fso.DeleteFolder fldr_path, true
      Else
        fso.DeleteFolder fldr_path, false
    End If
    fldr_path_last = fldr_path
    Select Case Err.Number
      Case 70
        MakeLog(&quot;Не удалось удалить папку [&quot; &amp; ClearPath(RootPath &amp; &quot;\&quot; &amp; arr(0,j)) &amp; &quot;]: Permission denied.&quot;)
      Case 76
        MakeLog(&quot;Не удалось удалить папку [&quot; &amp; ClearPath(RootPath &amp; &quot;\&quot; &amp; arr(0,j)) &amp; &quot;]: Path not found.&quot;)
      Case 0
        MakeLog(&quot;Done.&quot;)
      Case Else
        MakeLog(&quot;Не удалось удалить папку [&quot; &amp; ClearPath(RootPath &amp; &quot;\&quot; &amp; arr(0,j)) &amp; &quot;] по причине НЕХ, код ошибки: &quot; &amp; Err.Number)
    End Select
  End If
Err.Clear
next
End Sub
&#039;*******************************************************************************
&#039;*********************** Проверка исходных данных *****************************
&#039;*******************************************************************************
sub check_params()
  wscript.echo &quot;Начинаю проверку исходных данных для скрипта...&quot;
  Dim tmp1, tmp2, chkerr
  chkerr = 0
  tmp1 = ClearPath(left(ClearPath(CompLogFile), InStrRev(ClearPath(CompLogFile), &quot;\&quot;, -1, vbTextCompare)))
  &#039; проверяем папку для лог-файла
  If not fso.FolderExists(tmp1) Then
      wscript.echo &quot;=&gt; Папка для лог-файла не найдена! Проверьте переменную CompLogFile.&quot;
      chkerr = chkerr + 1 
    Else
      &#039; открываем(создаём) файл для записи:
      If log2file = 1 Then
&#039;          Dim oCompLogFile
          Set oCompLogFile = fso.OpenTextFile(CompLogFile, ForWriting, true, -2)
      End If
      MakeLog(&quot;папка для лог-файла обнаружена...&quot;)
      tmp2 = 1
  End If
  &#039; проверяем папку для файла вывода результатов проверки
  tmp1 = ClearPath(left(ClearPath(CompRezLogFile), InStrRev(ClearPath(CompRezLogFile), &quot;\&quot;, -1, vbTextCompare)))
  If not fso.FolderExists(tmp1) Then
      If tmp2 = 0 Then
          wscript.echo &quot;====&gt; Папка для файла с результатом проверки не найдена! Проверьте переменную CompRezLogFile.&quot;
        Else
          MakeLog(&quot;====&gt; Папка для файла вывода результатов проверки не найдена! Проверьте переменную CompRezLogFile.&quot;)
      End If
      chkerr = chkerr + 1
    Else
      If logrez2file Then
&#039;          Dim oCompRezLogFile
          Set oCompRezLogFile = fso.OpenTextFile(CompRezLogFile, ForWriting, true, -2)
      End If
      If tmp2 = 0 Then
          wscript.echo &quot;папка для файла вывода результатов проверки обнаружена...&quot;
        Else
          MakeLog(&quot;папка для файла вывода результатов проверкиобнаружена...&quot;)
      End If
  End If
  &#039; проверяем папку-источник
  If not fso.FolderExists(ClearPath(Path2CopyFrom)) Then
      If tmp2 = 0 Then
          wscript.echo &quot;====&gt; Исходная папка не найдена! Проверьте переменную Path2CopyFrom.&quot;
        Else
          MakeLog(&quot;====&gt; Исходная папка не найдена! Проверьте переменную Path2CopyFrom.&quot;)
      End If
      chkerr = chkerr + 1
    Else
      If tmp2 = 0 Then
          wscript.echo &quot;исходная папка обнаружена...&quot;
        Else
          MakeLog(&quot;исходная папка обнаружена...&quot;)
      End If
  End If
  &#039; проверяем папку-приёмник
  If not fso.FolderExists(ClearPath(Path2CopyTo)) Then
      If tmp2 = 0 Then
          wscript.echo &quot;=&gt; Конечная папка не найдена! Проверьте переменную Path2CopyTo.&quot;
        Else
          MakeLog(&quot;=&gt; Конечная папка не найдена! Проверьте переменную Path2CopyTo.&quot;)
      End If
      chkerr = chkerr + 1
    Else
      If tmp2 = 0 Then
          wscript.echo &quot;конечная папка обнаружена...&quot;
        Else
          MakeLog(&quot;конечная папка обнаружена...&quot;)
      End If
  End If
  If chkerr &lt;&gt; 0 Then
      If tmp2 = 0 Then
          wscript.echo &quot;&quot;
          wscript.echo &quot;Часть параметров задана не верно. Исправьте значения и запустите скрипт ещё раз.&quot;
        Else
          MakeLog(&quot;&quot;)
          MakeLog(&quot;Часть параметров задана не верно. Исправьте значения и запустите скрипт ещё раз.&quot;)
      End If
      wscript.quit
    Else
      MakeLog(&quot;All OK.&quot;)
      MakeLog(&quot;Начинаю проверку...&quot;)
  End If
end sub</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (BeS Yara)]]></author>
			<pubDate>Thu, 25 Feb 2010 10:28:13 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=33337#p33337</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript: IMAPI + IBurnVerification Interface]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=33290#p33290</link>
			<description><![CDATA[<p><strong>BeS Yara</strong>, конечно полезно и интересно.</p><p>OFF: я, оказывается, делал первый подход еще около года назад, загрузив и установив KB932716 (v2), но, то ли забыл, то ли не сумел… В общем, забыл и забросил; дело закончилось ничем. А тут, после Вашего первого сообщения в этой теме я заинтересовался, начал смотреть только что появившиеся примеры на MSDN, а, главное, попутно нашёл основное, что меня интересовало — быстрое и удобное программное создание ISO: <a href="http://social.msdn.microsoft.com/Forums/en/windowsopticalplatform/thread/eb034c50-7ada-485b-9669-cb5665ed5095">Creating ISO files with vbscript possible???</a>. Так что — конечно, выкладывайте, коллега!</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Tue, 23 Feb 2010 21:09:18 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=33290#p33290</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript: IMAPI + IBurnVerification Interface]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=33281#p33281</link>
			<description><![CDATA[<p>&quot;...мыши плакали, кололись, но продолжали есть кактус...&quot;</p><p>Собственно что прояснилось за время прошедшее с последнего моего поста:<br />1. С Майкрософт ответили(подтвердив сказанное YMP):<br /></p><div class="quotebox"><blockquote><p>Unfortunately the IBurnVerification interface cannot be used within a VB Script. The issue here is that IBurnVerification inherits from IUnknown, which is not compatible with OLE Automation.<br />Your feedback is appreciated. This information will be added to the IBurnVerification documentation in an upcoming release.</p></blockquote></div><p>2. В МСДН статья по <a href="http://msdn.microsoft.com/en-us/library/cc507512(VS.85).aspx">IBurnVerification Interface</a> пополнилось очень интересной заметкой &quot;Scripting languages limitation and workaround&quot;, самое приятное что следует из которой - во-первых, в дальнейших релизах ограничения будут сняты(&quot;This limitation will be fixed in next IMAPI release.&quot;), во-вторых, есть предложение как включить проверку сейчас - создать и зарегестрировать собственный COM(подробнее в самой заметке) и вызвать проверку через него. Что примечательно - в праздники как раз отладил проверялку результатов записи, когда обнаружил это обновление...</p><p>3. Перешел к тестированию на DVD, в результате чего выяснились некоторые особенности:<br />3.1. При использовании <a href="http://www.microsoft.com/downloads/details.aspx?displaylang=ru&amp;FamilyID=63ab51ea-99c9-45c0-980a-c556746fcf05">Пакет Windows Feature Pack for Storage 1.0</a> невозможно записать мультисессионный DVD с UDF (т.е. записывать файлы более 2Гб). Как вариант предлагается установка более старой версии IMAPI(<a href="http://support.microsoft.com/default.aspx/kb/932716">link</a>(отсутствует поддержка RW, BR, UDF только 1.02). Обещают что фикс будет в Vista SP2 и семёрке, а вот появится ли он для XP - это вопрос.<br />3.2. Видимо в связи с предыдущим пунктом на DVD+RW вторая сессия не пишется, но в отличии от +R-ки ошибка говорит от том что диск закрыт, хотя это и не так <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p><p>В итоге имеется два варианта - первый это сделать COM и жать бэкапы не одним файлом а с ограничением на кусок(чтобы писать не в UDF). Второй - ждать фиксов и тем временем всё равно бить бэкапы на мелньшие куски и писать без UDF(и пользоваться самопальной проверкой результата записи).</p><p>P.S. Если это будет полезно, то могу позже приложить свой вариант проверки записи(сначала вычистить хочу от лишних выводов в консоль, и возможно приделать вывод в логфайл <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" />). Алгоритм простой - сверяется список файлов в исходной папке и на оптическом диске. Если по списку и размеру всё сходится, делается сравнение файлов (чтение + StrComp).</p>]]></description>
			<author><![CDATA[null@example.com (BeS Yara)]]></author>
			<pubDate>Tue, 23 Feb 2010 10:24:19 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=33281#p33281</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript: IMAPI + IBurnVerification Interface]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=33048#p33048</link>
			<description><![CDATA[<p>Печально - а счастье было так близко <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /><br />Значит придётся придумывать альтернативные способы теста результатов записи (по md5 или даже побайтово сравнивать), по крайней мере пишущая часть скрипта работает и это уже хорошо.</p><p>Спасибо за ответы.</p><p>P.S. всегда остаётся надежда что в следующей версии IMAPI появится наконец возможность вызова проверки в скриптах...</p>]]></description>
			<author><![CDATA[null@example.com (BeS Yara)]]></author>
			<pubDate>Sun, 14 Feb 2010 06:43:09 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=33048#p33048</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript: IMAPI + IBurnVerification Interface]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=33047#p33047</link>
			<description><![CDATA[<p>Да, недоступен. При создании объекта VBScript использует его IUnknown, чтобы подключиться к IDispatch, дальше вся работа идёт через последний. Если IDispatch отсутствует, объект в скрипте бесполезен.</p>]]></description>
			<author><![CDATA[null@example.com (YMP)]]></author>
			<pubDate>Sun, 14 Feb 2010 04:48:19 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=33047#p33047</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript: IMAPI + IBurnVerification Interface]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=33045#p33045</link>
			<description><![CDATA[<p>На MSDN документацию подправили. Теперь:<br /></p><div class="quotebox"><blockquote><p>The IBurnVerification interface inherits from the IUnknown interface.</p></blockquote></div><p>С IUnknown в VBScript что-нибудь для решения задачи сделать возможно или этот интерфейс в среде VBScript недоступен?</p>]]></description>
			<author><![CDATA[null@example.com (BeS Yara)]]></author>
			<pubDate>Sat, 13 Feb 2010 14:23:49 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=33045#p33045</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript: IMAPI + IBurnVerification Interface]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=32778#p32778</link>
			<description><![CDATA[<div class="quotebox"><cite>YMP пишет:</cite><blockquote><p>Ну, в общем, из topic#2 ясно, что в документации ошибка и на самом деле IDispatch там нет. А без него из скрипта этот интерфейс не задействовать. Про VB6 ничего не могу сказать, для меня это то же, что для Вас Си. <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p></blockquote></div><p>В конце своего первого поста забыл приложить ссылку на сишный проект <a href="http://www.codeproject.com/KB/miscctrl/imapi2.aspx">Burning and Erasing CD/DVD/Blu-ray Media with C# and IMAPI2</a>. Вот конкретный кусок(я так понимаю, что если откуда-то IBurnVerification здесь и тянется, то точно не из IDispatch):<br /></p><div class="codebox"><pre><code>        //
        // Set the verification level
        //
        IBurnVerification burnVerification = (IBurnVerification)discFormatData;
        burnVerification.BurnVerificationLevel =
            (IMAPI_BURN_VERIFICATION_LEVEL)m_verificationLevel;</code></pre></div><p>discFormatData это объект MsftDiscFormat2Data, который в скрипте работает. Что-то мне подсказывает что всё таки из скрипта как-то добраться до IBurnVerification всё таки можно. Вот только я не понимаю что конкретно приведённый кусок кода делает(в терминах которые с помощью гугла помогут мне в поиске решения). <img src="//forum.script-coding.com/img/smilies/sad.png" width="15" height="15" /></p><p>Ну а ошибки в докуменации к сожалению бывают.</p>]]></description>
			<author><![CDATA[null@example.com (BeS Yara)]]></author>
			<pubDate>Tue, 02 Feb 2010 12:34:13 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=32778#p32778</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBScript: IMAPI + IBurnVerification Interface]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=32777#p32777</link>
			<description><![CDATA[<p>Ну, в общем, из topic#2 ясно, что в документации ошибка и на самом деле IDispatch там нет. А без него из скрипта этот интерфейс не задействовать. Про VB6 ничего не могу сказать, для меня это то же, что для Вас Си. <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p>]]></description>
			<author><![CDATA[null@example.com (YMP)]]></author>
			<pubDate>Tue, 02 Feb 2010 12:12:28 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=32777#p32777</guid>
		</item>
		<item>
			<title><![CDATA[VBScript: IMAPI + IBurnVerification Interface]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=32775#p32775</link>
			<description><![CDATA[<p>Добрый день.</p><p>Для начала задача: запись мультисессионных дисков из консоли с контролем результата записи(скидывать ежедневные бэкапы). Другими словами нужна замена для nerocmd.exe.</p><p>Волею судьбы наткнулся в MSDN на практически готовое решение средствами IMAPI(находка уже полезная, надо лишь доработать напильником). Приведённый ниже код это объединение <a href="http://msdn.microsoft.com/en-us/library/bb870772(VS.85).aspx">Creating a Multisession Disc</a>(непосредственно запись мультисессионного диска) и <a href="http://msdn.microsoft.com/en-us/library/aa366443(VS.85).aspx">Monitoring Progress With Events</a>(вывод в консоль сообщений о процессе записи - отсюда взята SUB + ConnectObject в функцию).</p><p>Единстенное что не нашел - пример как включить проверку записи(остальное работает, по крайней мере на CD-RW).<br />За проверку отвечает интерфейс <a href="http://msdn.microsoft.com/en-us/library/cc507512(VS.85).aspx">IBurnVerification</a>, но сложность в том, что &quot;No corresponding object&quot;, т.е. напрямую к нему обратиться я не могу. Есть подсказка - &quot;The IBurnVerification interface inherits from the IDispatch interface.&quot;, но мои познания в програмировании не позволяют мне понять как связать эти интерфейсы и как потом эту связку использовать. </p><p>Кстати в форумах МС также давались советы и по другим связываниям:<br /><a href="http://social.msdn.microsoft.com/Forums/en-US/windowsopticalplatform/thread/98ff73a4-1f11-40ed-b8b6-ccec27ea95b7">topic#1</a><br /></p><div class="quotebox"><blockquote><p>You need to cast MsftDiscFormat2Data to IBurnVerification, and only after that call IBurnVerificationPtr.BurnVerificationLevel =BurnVerificationLevel.Full;</p></blockquote></div><p><a href="http://social.msdn.microsoft.com/Forums/en-SG/windowsopticalplatform/thread/00a112f7-7e11-49ac-be8b-64ae2fed3229">topic#2</a><br /></p><div class="quotebox"><blockquote><p>Eric is correct that IBurnVerification interface derives from IUnknown and not from IDispatch, which could be contributing to your issue.</p></blockquote></div><p>Подскажите, пожалуйста, как же включить проверку записи в VB?<br />Также <span class="bbu">буду очень благодарен</span> на ссылку по которой можно почитать &quot;в теории&quot;, а ещё лучше с примерами о работе VB6 с COM объектами, особенно про упомянутые &quot;связывания&quot;. Конечно желательно на русском. Возможна ссылка на бумажную книгу(попробую найти в продаже).</p><div class="codebox"><pre><code>&#039; This script adds data files from a single directory tree to a
&#039; disc (a new session is added, if the disc already contains data)

&#039; Copyright (C) Microsoft Corporation. All rights reserved.

Option Explicit

&#039; *** CD/DVD disc file system types
Const FsiFileSystemISO9660 = 1
Const FsiFileSystemJoliet  = 2
Const FsiFileSystemUDF102  = 4

&#039; *** IFormat2Data Write Action Enumerations
Const IMAPI_FORMAT2_DATA_WRITE_ACTION_VALIDATING_MEDIA      = 0
Const IMAPI_FORMAT2_DATA_WRITE_ACTION_FORMATTING_MEDIA      = 1
Const IMAPI_FORMAT2_DATA_WRITE_ACTION_INITIALIZING_HARDWARE = 2
Const IMAPI_FORMAT2_DATA_WRITE_ACTION_CALIBRATING_POWER     = 3
Const IMAPI_FORMAT2_DATA_WRITE_ACTION_WRITING_DATA          = 4
Const IMAPI_FORMAT2_DATA_WRITE_ACTION_FINALIZATION          = 5
Const IMAPI_FORMAT2_DATA_WRITE_ACTION_COMPLETED             = 6
const IMAPI_FORMAT2_DATA_WRITE_ACTION_VERIFYING             = 7

&#039; IMAPI_BURN_VERIFICATION_LEVEL Enumeration
Const IMAPI_BURN_VERIFICATION_NONE                          = 0
Const IMAPI_BURN_VERIFICATION_QUICK                         = 1
Const IMAPI_BURN_VERIFICATION_FULL                          = 2 

WScript.Quit(Main)

Function Main
    Dim Index                &#039; Index to recording drive.
    Dim Recorder             &#039; Recorder object
    Dim Path                 &#039; Directory of files to add
    Dim Stream               &#039; Data stream for burning device
    
    Index = 0                &#039; First drive on the system
    Path = &quot;c:\!2Burn\2&quot;      &#039; Files to add to the disc

    &#039; Create a DiscMaster2 object to connect to optical drives.
    Dim DiscMaster
    Set DiscMaster = WScript.CreateObject(&quot;IMAPI2.MsftDiscMaster2&quot;)

    &#039; Create a DiscRecorder2 object for the specified burning device.
    Dim UniqueId
    set Recorder = WScript.CreateObject(&quot;IMAPI2.MsftDiscRecorder2&quot;)
    UniqueId = DiscMaster.Item(Index)
    Recorder.InitializeDiscRecorder(UniqueId)

    &#039; Create a DiscFormat2Data object and set the recorder
    Dim DataWriter
    Set DataWriter = CreateObject (&quot;IMAPI2.MsftDiscFormat2Data&quot;)
    DataWriter.Recorder = Recorder
    DataWriter.ClientName = &quot;IMAPIv2 TEST&quot;

    &#039; Set the verification level
&#039; а вот тут-то и затык

    &#039; Create a new file system image object
    Dim FSI
    Set FSI = CreateObject(&quot;IMAPI2FS.MsftFileSystemImage&quot;)

    &#039; Import the last session, if the disc is not empty, or initialize
    &#039; the file system, if the disc is empty
    If Not DataWriter.MediaHeuristicallyBlank _
    Then
        On Error Resume Next
        &#039; !!!
        FSI.MultisessionInterfaces = DataWriter.MultisessionInterfaces
        If Err.Number &lt;&gt; 0 _
        Then
            WScript.Echo &quot;Multisession is not supported for this disc&quot;
            Main = 1
            Exit Function
        End If
        On Error Goto 0

        WScript.Echo &quot;Importing data from the previous session...&quot;
        FSI.ImportFileSystem()
    Else 
        FSI.ChooseImageDefaults(Recorder)
    End If

    &#039; Add the directory and its contents to the file system 
    WScript.Echo &quot;Adding &quot; &amp; Path &amp; &quot; directory to the disc...&quot;
    FSI.Root.AddTree Path, false

    &#039; Create an image from the file system image object
    Dim Result
    Set Result = FSI.CreateResultImage()
    Stream = Result.ImageStream
&#039;###############################################################################
    &#039; Attach event handler to the data writing object.
    WScript.ConnectObject  dataWriter, &quot;dwBurnEvent_&quot;
&#039;###############################################################################
    
    &#039; Write stream to disc using the specified recorder
    WScript.Echo &quot;Writing content to the disc...&quot;
    DataWriter.Write(Stream)

    WScript.Echo &quot;Finished writing content.&quot;
    Main = 0
End Function

SUB dwBurnEvent_Update( byRef object, byRef progress )
    DIM strTimeStatus
    strTimeStatus = &quot;Time: &quot; &amp; progress.ElapsedTime &amp; _
        &quot; / &quot; &amp; progress.TotalTime
   
    SELECT CASE progress.CurrentAction
    CASE IMAPI_FORMAT2_DATA_WRITE_ACTION_VALIDATING_MEDIA
        WScript.Echo &quot;Validating media &quot; &amp; strTimeStatus

    CASE IMAPI_FORMAT2_DATA_WRITE_ACTION_FORMATTING_MEDIA
        WScript.Echo &quot;Formatting media &quot; &amp; strTimeStatus
        
    CASE IMAPI_FORMAT2_DATA_WRITE_ACTION_INITIALIZING_HARDWARE
        WScript.Echo &quot;Initializing Hardware &quot; &amp; strTimeStatus

    CASE IMAPI_FORMAT2_DATA_WRITE_ACTION_CALIBRATING_POWER
        WScript.Echo &quot;Calibrating Power (OPC) &quot; &amp; strTimeStatus

    CASE IMAPI_FORMAT2_DATA_WRITE_ACTION_WRITING_DATA
        DIM totalSectors, writtenSectors, percentDone
        totalSectors = progress.SectorCount
        writtenSectors = progress.LastWrittenLba - progress.StartLba
        percentDone = FormatPercent(writtenSectors/totalSectors)
        WScript.Echo &quot;Progress:  &quot; &amp; percentDone &amp; &quot;  &quot; &amp; strTimeStatus

    CASE IMAPI_FORMAT2_DATA_WRITE_ACTION_FINALIZATION
        WScript.Echo &quot;Finishing the writing &quot; &amp; strTimeStatus
    
    CASE IMAPI_FORMAT2_DATA_WRITE_ACTION_COMPLETED
        WScript.Echo &quot;Completed the burn.&quot;

    CASE IMAPI_FORMAT2_DATA_WRITE_ACTION_VERIFYING
        WScript.Echo &quot;Verifying the data.&quot;

    CASE ELSE
        WScript.Echo &quot;Unknown action: &quot; &amp; progress.CurrentAction
    END SELECT
END SUB</code></pre></div><p>На всякий случай приведу ссылку на проект с IMAPI(к сожалению на C#, познания в котором у меня ограничиваются необходимостью ставить &quot;;&quot; в конце строки <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" />). В этом коде проверка есть, но не зная синтаксиса C# переделать нужный кусок в VB6(VBScript) я не могу. В Яндекс-Гугл(да и Bing тоже) все найденные ссылки опять таки вели к решению проблем в сишном коде.</p>]]></description>
			<author><![CDATA[null@example.com (BeS Yara)]]></author>
			<pubDate>Tue, 02 Feb 2010 11:05:33 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=32775#p32775</guid>
		</item>
	</channel>
</rss>
