1

Тема: Макрос для анализа содержимого 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.

2

Re: Макрос для анализа содержимого BLOB

Дякуємо, Олександре, цікаве рішення.