Разархивировать файл в классическом asp

Я пытаюсь использовать класс unzip/zip. Мне нужно распаковать ZIP-файл после загрузки. я изменил функцию "сна" для проверки функции "контроллера" по значению intSeconds и добавил функцию "контроллера" для проверки количества файлов в целевой папке. Вы можете увидеть часть кода ниже.

ZIP-файл успешно разархивирован с помощью этих функций, но прогресс страницы никогда не заканчивается. Мне нужно перезагрузить IIS после того, как использовать эту функцию.

Оригинальный код на: Class CompressedFolder

<%
    Set objShell = CreateObject("Shell.Application")
    Set objFso   = CreateObject("Scripting.FileSystemObject")

    Function ExtractAll(strZipFile, strFolder)
        If Not objFso.FolderExists(strFolder) Then objFso.CreateFolder(strFolder)
        intCount = objShell.NameSpace(strFolder).Items.Count
        Set colItems = objShell.NameSpace(strZipFile).Items
        objShell.NameSpace(strFolder).CopyHere colItems, 8
        Sleep 5000,strFolder,intCount + colItems.Count
    End Function        

    function controller(path,filesCountMust)
       dim stat:stat=False
       set fold = objFso.getFolder(path)
       set files = fold.files
       if filesCountMust=files.count then
          stat=True
       end if
       set files = nothing 
       set fold = nothing
       controller=stat
    end function

    Sub Sleep(intSeconds,path,filesCountMust)
        dblSeconds = intSeconds / 1000
        If dblSeconds < 1 Then dblSeconds = 1
        dteStart = Now()
        dteEnd = DateAdd("s", dblSeconds, dteStart)  
        do While dteEnd>=Now()
           if dteEnd=Now() then
              if controller(path,filesCountMust)=true then 
                 exit do
              else
                 Sleep intSeconds,path,filesCountMust
              end if
           end if
        loop
    End Sub

    Set objShell = Nothing
    Set objFso   = Nothing

%>

2 ответа

Эта линия является проблемой

if dteEnd=Now() then

Только если dteEnd точно такой же, как Now() (с точностью до миллисекунды), он сможет войти в секцию контроллера и направиться к выходу do, он этого не сделает и перейдет в рекурсивный цикл (обратно в функцию сна).

Попробуйте это вместо этого:

do While dteEnd>=Now()
   if dteEnd>=Now() then
      if controller(path,filesCountMust)=true then 
         exit do
      else
         Sleep intSeconds,path,filesCountMust
      end if
   end if
loop

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

https://github.com/rcdmk/aspZip

Другие вопросы по тегам