Что нового

[Данные, строки] Детальный разбор функции _FileListToArrayRec

Dellroc

Осваивающий
Сообщения
151
Репутация
31
Добрый день.
Подскажите пожалуйста такой нюанс. Внутри функции FileWriteFromArray есть длл структура
Код:
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), которые будут дополнительно задерживать процесс обработки.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Re: [Данные, строки] Детальный разбор функции _FileWriteFromArray

каков же объем данных, что процесс обработки может затянуться?
может лучше избавиться от паранойи "делать все быстренько"?
проблема может быть в другой части кода
 
A

Alofa

Гость
Re: [Данные, строки] Детальный разбор функции _FileWriteFromArray

Dellroc сказал(а):
... Внутри функции FileWriteFromArray есть длл структура...
Нет там такой структуры, там вообще никакой структуры нет - она есть в "_FileListToArrayRec()"

Dellroc сказал(а):
... получить параметра 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 MA:rofl:WORD.
The size of the file is equal to (nFileSizeHigh * (MA:rofl:WORD+1)) + nFileSizeLow.
nFileSizeLow
The low-order DWORD value of the file size, in bytes.
...
 
Автор
D

Dellroc

Осваивающий
Сообщения
151
Репутация
31
Re: [Данные, строки] Детальный разбор функции _FileWriteFromArray

Alofa сказал(а):
Dellroc сказал(а):
... Внутри функции FileWriteFromArray есть длл структура...
Нет там такой структуры, там вообще никакой структуры нет - она есть в "_FileListToArrayRec()"

Dellroc сказал(а):
... получить параметра 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 MA:rofl:WORD.
The size of the file is equal to (nFileSizeHigh * (MA:rofl:WORD+1)) + nFileSizeLow.
nFileSizeLow
The low-order DWORD value of the file size, in bytes.
...
Отлично. Подскажите теперь как получить это значение.


Добавлено:
Сообщение автоматически объединено:

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


Добавлено:
Сообщение автоматически объединено:

Не модифицированная команда смогла обработать 6млн. файлов и сдохла, выдав "error allocating memory". Помогите пожалуйста с данным вопросом. Очень актуально.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Dellroc

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


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

Dellroc

Осваивающий
Сообщения
151
Репутация
31
В общем вот сам скрипт:
Код:
#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')
 
Автор
D

Dellroc

Осваивающий
Сообщения
151
Репутация
31
Решение простое. Поставил старую версию компилятора и на ней всё в порядке.
 
Верх