Автор Тема: [Данные, строки] Детальный разбор функции _FileListToArrayRec  (Прочитано 610 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Эта тема содержит сообщение, помеченное как лучший ответ. Кликните здесь для перехода к этому сообщению.

Оффлайн Dellroc [?]

  • Осваивающий
  • **
  • Сообщений: 137
  • Репутация: 27
    • Награды
Добрый день.
Подскажите пожалуйста такой нюанс. Внутри функции FileWriteFromArray есть длл структура
Код: AutoIt [Выделить]
Local $tFile_Data = DllStructCreate("struct;align 4;dword FileAttributes;uint64 CreationTime;uint64 LastAccessTime;uint64 LastWriteTime;" & _
                "dword FileSizeHigh;dword FileSizeLow;dword Reserved0;dword Reserved1;wchar FileName[260];wchar AlternateFileName[14];endstruct")

Пытаюсь согласно данным структуры получить параметра FileSizeHigh, а в ответ приходят только нули. Хотя параметр FileSizeLow возвращает всё как нужно, только  он не подходит, т.к. представляет не тот размер, который нужен.
Вопрос к тому, что хотелось бы обойтись без лишних вызовов отдельных функций (н-р: FileGetSize), которые будут дополнительно задерживать процесс обработки.
« Последнее редактирование: Апрель 17, 2017, 07:34:03 от Dellroc »

Русское сообщество AutoIt


Оффлайн joiner [?]

  • Расмус-бродяга
  • AutoIt Гуру
  • *****
  • Сообщений: 2512
  • Репутация: 429
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
каков же объем данных, что процесс обработки может затянуться?
может лучше избавиться от паранойи "делать все быстренько"?
проблема может быть в другой части кода
Были времена, когда солнце было ярче, трава зеленее, а водка сорокоградуснее

Оффлайн Alofa [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1149
  • Репутация: 161
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
... Внутри функции FileWriteFromArray есть длл структура...
Нет там такой структуры, там вообще никакой структуры нет - она есть в "_FileListToArrayRec()"

... получить параметра FileSizeHigh, а в ответ приходят только нули...
Если вы уж решили переделывать под себя какую-либо UDF функцию, то будьте готовы изучать и MSDN.
А там написано следующее:
Цитировать
...
nFileSizeHigh
   The high-order DWORD value of the file size, in bytes.
   This value is zero unless the file size is greater than MAXDWORD.
   The size of the file is equal to (nFileSizeHigh * (MAXDWORD+1)) + nFileSizeLow.
nFileSizeLow
   The low-order DWORD value of the file size, in bytes.
...


Оффлайн Dellroc [?]

  • Осваивающий
  • **
  • Сообщений: 137

  • Автор темы
  • Репутация: 27
    • Награды
... Внутри функции FileWriteFromArray есть длл структура...
Нет там такой структуры, там вообще никакой структуры нет - она есть в "_FileListToArrayRec()"

... получить параметра FileSizeHigh, а в ответ приходят только нули...
Если вы уж решили переделывать под себя какую-либо UDF функцию, то будьте готовы изучать и MSDN.
А там написано следующее:
Цитировать
...
nFileSizeHigh
   The high-order DWORD value of the file size, in bytes.
   This value is zero unless the file size is greater than MAXDWORD.
   The size of the file is equal to (nFileSizeHigh * (MAXDWORD+1)) + nFileSizeLow.
nFileSizeLow
   The low-order DWORD value of the file size, in bytes.
...
Отлично. Подскажите теперь как получить это значение.


Добавлено: Апрель 17, 2017, 09:37:12
Ещё такой нюанс что при количестве файлов больше 900 тысяч вылезает "Error allocating memory" хотя памяти ещё свободной вагон. Что можно попробовать с этим сделать?
Нужно получить дату последнего доступа к файлу, а перебрать требуется порядка 20 миллионов.


Добавлено: Апрель 17, 2017, 14:24:19
Не модифицированная команда смогла обработать 6млн. файлов и сдохла, выдав "error allocating memory". Помогите пожалуйста с данным вопросом. Очень актуально.
« Последнее редактирование: Апрель 17, 2017, 14:24:19 от Dellroc, Причина: Объединение сообщений »

Русское сообщество AutoIt

Re: [Данные, строки] Детальный разбор функции _FileWriteFromArray
« Ответ #3 Отправлен: Апрель 17, 2017, 07:33:38 »

Оффлайн Garrett [?]

  • Глобальный модератор
  • *
  • Сообщений: 3903
  • Репутация: 957
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Dellroc

ПредупреждениеЗа нарушение общих правил (пункт В.2):
Цитировать
Старайтесь избегать “Over quoting” (преувеличенное цитирование) - цитируйте только необходимую часть сообщения, которая наилучшим образом подчеркнёт суть цитируемого.


С уважением, ваш Глобальный модератор.

Скорблю и помню.




Оффлайн Dellroc [?]

  • Осваивающий
  • **
  • Сообщений: 137

  • Автор темы
  • Репутация: 27
    • Награды
В общем вот сам скрипт:
Код: AutoIt [Выделить]
#include <File.au3>
#include <Array.au3>
#include <String.au3>

Opt('MustDeclareVars',1)

For $i=1 To 20
    If FileExists(@DesktopDir&'\File_checker'&$i&'.txt') Then FileDelete(@DesktopDir&'\File_checker.txt')
Next
Global $gFolder = FileSelectFolder('','')
If $gFolder='' Then Exit
Global $gTimer = TimerInit()
ToolTip('Work',0,0)
;~ $hDir = Run(@ComSpec & ' /U /C DIR "' & $sPath & '\' & $aMasks[$i] & '" /S /B' & $sAttrib, @SystemDir, @SW_HIDE, 6)
Global $gQuantyFiles=1
Local $tRead, $tOut='',$tFileTime=@error,$tQuanty=1,$tArFiles
Dim $tAr[1000001][3]
Global $PID = Run(@ComSpec&' /U /C dir "\\?\'&$gFolder&'" /A-D /S /B', @SystemDir, @SW_HIDE, 6)
        While 1
            $tRead = StdoutRead($PID, False, True)

            If @error Then
                ExitLoop
            EndIf

            If $tRead <> '' Then

                $tOut = BinaryToString($tRead, 2)
;~              ConsoleWrite($tOut)
                $tArFiles = StringRegExp($tOut, '\\\\\?\\(\N+)',3)

                If Not @error Then
                    For $i=0 to UBound($tArFiles)-1
                        ToolTip('Work Q='&$tQuanty&', F='&$gQuantyFiles,0,0)
                        $tAr[0][0]=$tQuanty
                        $tFileTime = FileGetTime($tArFiles[$i],2)
                        If Not @error Then $tAr[$tQuanty][0] = $tFileTime[0]&'.'&$tFileTime[1]&'.'&$tFileTime[2]
;~                      $tAr[$tQuanty][1] = FileGetSize($tArFiles[$i])
                        $tAr[$tQuanty][1] = StringReplace(FileGetSize($tArFiles[$i])/1000000,'.',',')
                        $tAr[$tQuanty][2] = $tArFiles[$i]
                        $tQuanty+=1

                        If $tQuanty =1000000 Then
                            ToolTip('Save Q='&$tQuanty&', F='&$gQuantyFiles,0,0)
                            _FileWriteFromArray(@DesktopDir&'\File_checker'&$gQuantyFiles&'.txt',$tAr,Default,Default,@TAB)
                            $tQuanty=1
                            $gQuantyFiles+=1
                        EndIf

                    Next
                EndIf

            EndIf
        Wend
;~ ConsoleWrite(@CRLF&BinaryToString($tOut, 2))
ReDim $tAr[$tAr[0][0]+1][3]
ToolTip('Save Q='&$tQuanty&', F='&$gQuantyFiles,0,0)
_FileWriteFromArray(@DesktopDir&'\File_checker'&$gQuantyFiles&'.txt',$tAr,Default,Default,@TAB)
ToolTip('',0,0)
MsgBox(0,'Ready',StringTrimRight(Round(TimerDiff($gTimer),-3),3)&' sec')


Помечен как лучший ответ пользователем Dellroc Отправлен Апрель 21, 2017, 15:33:24

Оффлайн Dellroc [?]

  • Осваивающий
  • **
  • Сообщений: 137

  • Автор темы
  • Репутация: 27
    • Награды
Решение простое. Поставил старую версию компилятора и на ней всё в порядке.

Русское сообщество AutoIt

Re: [Данные, строки] Детальный разбор функции _FileListToArrayRec
« Ответ #6 Отправлен: Апрель 21, 2017, 15:21:08 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
7 Ответов
4489 Просмотров
Последний ответ Август 02, 2010, 15:08:53
от diabloff
4 Ответов
2493 Просмотров
Последний ответ Июль 16, 2011, 23:13:24
от Viktor1703
8 Ответов
3196 Просмотров
Последний ответ Октябрь 21, 2011, 14:30:51
от madmasles
3 Ответов
2799 Просмотров
Последний ответ Октябрь 22, 2011, 15:52:31
от Kirill_T
7 Ответов
5063 Просмотров
Последний ответ Февраль 10, 2012, 15:57:21
от RUVATA
0 Ответов
1568 Просмотров
Последний ответ Февраль 09, 2012, 19:27:24
от madmasles
5 Ответов
7136 Просмотров
Последний ответ Июнь 07, 2012, 11:47:52
от ---Zak---
2 Ответов
973 Просмотров
Последний ответ Июль 30, 2014, 21:14:10
от royalfint
0 Ответов
446 Просмотров
Последний ответ Июль 30, 2014, 21:31:21
от madmasles
5 Ответов
3290 Просмотров
Последний ответ Декабрь 07, 2015, 01:39:33
от CreatoR