Тема: Макрос для анализа содержимого BLOB
Насобирался определенный хлам, отдельные виды файлов не видно в менеджере документов, ниже макрос для их вытягивания и анализа
LOCAL oSQL, cFileName, cTempFile, nIDBlob, cExt, hFile, cHeader
LOCAL nByte1, nByte2, nByte3, nByte4, nResult
LOCAL nJpg := 0, nPng := 0, nGif := 0, nPdf := 0, nZip := 0, nDoc := 0, nBmp := 0, nDat := 0, nTotal := 0
LOCAL cStats, cLog
DirMake("D:\temp\blobs")
cLog := "=== ЭКСПОРТ BLOB ===" + CHR(13) + CHR(10)
cLog += "Дата: " + DTOC(DATE()) + " " + TIME() + CHR(13) + CHR(10)
cLog += "=============================" + CHR(13) + CHR(10) + CHR(13) + CHR(10)
oSQL := SpSQL():new(,,,,,,.T.):create()
oSQL:executeDirect("SELECT idblob, blob FROM intrablob_000000")
DO WHILE !oSQL:eof()
nIDBlob := oSQL:dataArea:idblob
cTempFile := "D:\temp\blobs\temp_" + LTRIM(STR(nIDBlob)) + ".tmp"
oSQL:binaryToFile('blob', cTempFile)
hFile := FOPEN(cTempFile)
cHeader := SPACE(4)
FREAD(hFile, @cHeader, 4)
FCLOSE(hFile)
nByte1 := ASC(SUBSTR(cHeader, 1, 1))
nByte2 := ASC(SUBSTR(cHeader, 2, 1))
nByte3 := ASC(SUBSTR(cHeader, 3, 1))
nByte4 := ASC(SUBSTR(cHeader, 4, 1))
cExt := "dat"
IF nByte1 == 255 .AND. nByte2 == 216 .AND. nByte3 == 255
cExt := "jpg"
nJpg++
ELSEIF nByte1 == 137 .AND. nByte2 == 80 .AND. nByte3 == 78 .AND. nByte4 == 71
cExt := "png"
nPng++
ELSEIF nByte1 == 71 .AND. nByte2 == 73 .AND. nByte3 == 70
cExt := "gif"
nGif++
ELSEIF nByte1 == 37 .AND. nByte2 == 80 .AND. nByte3 == 68 .AND. nByte4 == 70
cExt := "pdf"
nPdf++
ELSEIF nByte1 == 80 .AND. nByte2 == 75 .AND. nByte3 == 3 .AND. nByte4 == 4
cExt := "zip"
nZip++
ELSEIF nByte1 == 208 .AND. nByte2 == 207 .AND. nByte3 == 17 .AND. nByte4 == 224
cExt := "doc"
nDoc++
ELSEIF nByte1 == 66 .AND. nByte2 == 77
cExt := "bmp"
nBmp++
ELSE
nDat++
ENDIF
cFileName := "D:\temp\blobs\file_" + LTRIM(STR(nIDBlob)) + "." + cExt
// Удаляем целевой файл если существует
IF File(cFileName)
FERASE(cFileName)
ENDIF
// Переименовываем
nResult := FRename(cTempFile, cFileName)
// Добавляем в лог
cLog += LTRIM(STR(nIDBlob)) + CHR(9) + "file_" + LTRIM(STR(nIDBlob)) + "." + cExt + CHR(9) + UPPER(cExt) + CHR(13) + CHR(10)
nTotal++
oSQL:skip()
ENDDO
oSQL:destroy()
// Статистика
cLog += CHR(13) + CHR(10)
cLog += "=============================" + CHR(13) + CHR(10)
cLog += "=== СТАТИСТИКА ===" + CHR(13) + CHR(10)
cLog += "=============================" + CHR(13) + CHR(10)
cLog += "Всего файлов: " + LTRIM(STR(nTotal)) + CHR(13) + CHR(10)
cLog += "JPG: " + LTRIM(STR(nJpg)) + CHR(13) + CHR(10)
cLog += "PNG: " + LTRIM(STR(nPng)) + CHR(13) + CHR(10)
cLog += "GIF: " + LTRIM(STR(nGif)) + CHR(13) + CHR(10)
cLog += "PDF: " + LTRIM(STR(nPdf)) + CHR(13) + CHR(10)
cLog += "DOC: " + LTRIM(STR(nDoc)) + CHR(13) + CHR(10)
cLog += "ZIP: " + LTRIM(STR(nZip)) + CHR(13) + CHR(10)
cLog += "BMP: " + LTRIM(STR(nBmp)) + CHR(13) + CHR(10)
cLog += "DAT: " + LTRIM(STR(nDat)) + CHR(13) + CHR(10)
// Сохраняем лог
MemoWrit("D:\temp\blobs\export_log.txt", cLog)
// Показываем статистику
cStats := "Всего: " + LTRIM(STR(nTotal)) + CHR(13)
cStats += "JPG: " + LTRIM(STR(nJpg)) + CHR(13)
cStats += "PNG: " + LTRIM(STR(nPng)) + CHR(13)
cStats += "GIF: " + LTRIM(STR(nGif)) + CHR(13)
cStats += "PDF: " + LTRIM(STR(nPdf)) + CHR(13)
cStats += "DOC: " + LTRIM(STR(nDoc)) + CHR(13)
cStats += "ZIP: " + LTRIM(STR(nZip)) + CHR(13)
cStats += "BMP: " + LTRIM(STR(nBmp)) + CHR(13)
cStats += "DAT: " + LTRIM(STR(nDat)) + CHR(13) + CHR(13)
cStats += "Лог сохранён в export_log.txt"
MsgBox(cStats)
RETURN .T.