Сканирование директорий ПК и сети

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Stalker
Активист
Сообщения: 123
Зарегистрирован: 01 Декабрь 2005, 20:47
Откуда: Минск
Контактная информация:

Сканирование директорий ПК и сети

Сообщение Stalker » 05 Март 2011, 14:57

Привет всем!
C 63.-59 Возникла такая задача. Необходимо просканировать все диски ПК и расшаренные папки в сети и внести в файл fail.tps информацию с названием файла , атрибутами, временем создания, контрольной суммой и т.д. Причем пройтись по всем директориям, в том числе с вложенными развлетненными и т.д. Можно и нужно наверное использовать DIRECTORY (получить список файлов в каталоге), но как организовать прохождение и обработку не только текущей директории , а и вложенных, в которых может быть также подмножество директорий и так до корня. Может быть кто решал подобную задачу, подскажите куда рулить, или есть ли подобные шаблоны и решения.
С уважением, Stalker.
Специализация - программы для образования, делопроизводство, складской учет

IKSoft
Посетитель
Сообщения: 29
Зарегистрирован: 27 Май 2010, 12:38

Re: Сканирование директорий ПК и сети

Сообщение IKSoft » 05 Март 2011, 16:09

Вот нечто. У меня работает
Перебирает все до конца

tqLF это queue как в Directory Чуть добавли свои поля


tqLF QUEUE,TYPE
Name STRING(FILE:MAXFILENAME) !FILE:MAXFILENAME is an EQUATE
ShortName STRING(13)
Date LONG
Time LONG
Size LONG
Attrib BYTE !A bitmap, the same as the attributes EQUATEs
recs long
szFullName cstring(255)
flag long
END

Код: Выделить всё

tcIO.mLoadDir                        function(tqLF pqLF, *cstring p_Path, *cstring p_Mask, long p_SkipSubDir = 0)
Que   Queue
str     cstring(61)
      .
loc:Sep  cstring('|')

  code
  self.mStrToQue(p_Mask, Que, loc:Sep, 0)
  return(self.mLoadDirQ(pqLF, p_Path, Que, p_SkipSubDir))

tcIO.mLoadDirQ                        function(tqLF pqLF, *cstring p_Path, Queue p_Que, long p_SkipSubDir = 0)
loc:i       long
loc:szPath     cstring(255)
loc:szNewPath  cstring(255)
loc:j       long
qLF         queue(tqLF).


loc:Flag    long

loc:Mask  cstring(64)
pAny      Any


 code
 loc:Flag = pqLF.Flag

 pAny &= what(p_Que,1)

 !Сначала все поддиректории
 loc:szPath = p_Path & '*.*'
 directory(qLF, loc:szPath, ff_:directory )
 loop loc:i = 1 to records(qLF)
    get(qLF, loc:i)


    if clip(qLF.ShortName) = '..'
       cycle.
    if clip(qLF.ShortName) = '.'
       cycle.

    if band(qLF.Attrib, ff_:DIRECTORY)
       !Message(p_Path&'|'&qLF.Name,'Dir')
       if p_SkipSubDir = 0
          loc:szNewPath = p_Path & clip(qLF.Name) & '\'
          self.mLoadDirQ(pqLF, loc:szNewPath, p_Que)
       .
    .
 .

 if ~records(p_Que)
    loc:Mask = '*.*'
    do RunIt
 else
    loop loc:j = 1 to records(p_Que)
       get(p_Que, loc:j)
       loc:Mask = pAny
       do RunIt
    .
 .
 return(1)


RunIt  routine
 free(qLF)
 loc:szPath = p_Path & loc:Mask

 !Message(loc:szPath)

 directory(qLF, loc:szPath, ff_:NORMAL  + ff_:READONLY + ff_:ARCHIVE)

 loop loc:i = 1 to records(qLF)
    get(qLF, loc:i)

    if clip(qLF.ShortName) = '..'
       cycle.
    if clip(qLF.ShortName) = '.'
       cycle.

    if band(qLF.Attrib, ff_:DIRECTORY)
    else
       pqLF = qLF
       pqLF.szFullName = p_Path & clip(qLF.Name)
       pqLF.recs = 0

       pqLF.Flag = loc:flag

       add(pqLF)
    .
 .


tcIO.mStrToQue              function(*cstring p_Str, Queue p_Que, *cstring p_Sep, long p_Flag)
pAny  Any
loc:len   ulong
loc:pos   ulong
loc:currpos   ulong
loc:str    cstring(2048) 
loc:SepLen long


!loc:m  equate(500)
!loc:mx long
 code
 if ~p_Flag
   free(p_Que)
   clear(p_Que)
 .

 pAny &= what(p_Que,1)

 loc:len = len(clip(p_Str))
 loc:currpos = 1
 !Message(loc:Len)

 loc:SepLen = len(p_Sep)

 loop
   loc:pos = instring(p_Sep,p_str,1,loc:currpos)
   if ~loc:pos
      break.
   loc:Str = p_Str[loc:currpos : loc:pos - 1]&'<0>'
   loc:currpos = loc:pos + loc:Seplen
   do add_que
 .
 if loc:currpos < loc:len 
    loc:Str = p_Str[loc:currpos : loc:len]&'<0>'
    do add_que
 .

 return(0)

Add_que  routine
 loc:str = clip(loc:str)
 if len(loc:str)
    pAny = loc:str
    add(p_que)
 else
    clear(p_que)
    add(p_que)
 .



Stalker
Активист
Сообщения: 123
Зарегистрирован: 01 Декабрь 2005, 20:47
Откуда: Минск
Контактная информация:

Re: Сканирование директорий ПК и сети

Сообщение Stalker » 10 Март 2011, 23:52

Спасибо ! За помощь.
Проверю как пойдет. С уважением Stalker
Специализация - программы для образования, делопроизводство, складской учет

Stalker
Активист
Сообщения: 123
Зарегистрирован: 01 Декабрь 2005, 20:47
Откуда: Минск
Контактная информация:

Re: Сканирование директорий ПК и сети

Сообщение Stalker » 25 Март 2011, 9:55

Здравствуйте!
Попробовал собрать пример, что-то не пошло. Не могу собрать приложение. Если есть законченное приложение или что либо вроде шаблона, если не трудно вышлите на мыло stalker.mil@tut.by, либо инструкции как собрать приложение из предложенного листинга. Заранее благодарен, с уважением Stalker.
Специализация - программы для образования, делопроизводство, складской учет

Аватара пользователя
Admin
Администратор
Сообщения: 3483
Зарегистрирован: 05 Июль 2005, 14:59
Откуда: Хабаровск
Контактная информация:

Re: Сканирование директорий ПК и сети

Сообщение Admin » 25 Март 2011, 10:33

И Все то за вас делать :)
Вот готовый пример на основе предыдущего кода.

Код: Выделить всё

            PROGRAM
            MAP
            END

tqLF        QUEUE,TYPE
Name          STRING(FILE:MAXFILENAME) !FILE:MAXFILENAME is an EQUATE
ShortName     STRING(13)
Date          LONG
Time          LONG
Size          LONG
Attrib        BYTE !A bitmap, the same as the attributes EQUATEs
recs          long
szFullName    cstring(255)
flag          long
            END

tcIO        CLASS,TYPE
mLoadDir      function(tqLF pqLF, *cstring p_Path, *cstring p_Mask, long p_SkipSubDir = 0),byte,proc
mLoadDirQ     function(tqLF pqLF, *cstring p_Path, Queue p_Que, long p_SkipSubDir = 0),byte,proc
mStrToQue     function(*cstring p_Str, Queue p_Que, *cstring p_Sep, long p_Flag),byte,proc
            END

QQ          tqLF
YY          tcIO
Path        CSTRING(200)
Mask        CSTRING(200)

Window WINDOW('Dirlist'),AT(,,359,261),FONT('Tahoma',8,,FONT:regular,CHARSET:CYRILLIC),CENTER,GRAY,DOUBLE
       LIST,AT(2,3,355,256),USE(?List1),VSCROLL,FORMAT('39L(2)|M~szFullName~@s255@#8#'),FROM(QQ)
     END

  CODE
  OPEN(Window)
  Path = 'c:\Clarion6\'
  Mask = '*.tps|*.bmp'
  YY.mLoadDir(QQ,Path,Mask)
  ACCEPT
  END
  CLOSE(Window)


tcIO.mLoadDir                        function(tqLF pqLF, *cstring p_Path, *cstring p_Mask, long p_SkipSubDir = 0)
Que   Queue
str     cstring(61)
      .
loc:Sep  cstring('|')

  code
  self.mStrToQue(p_Mask, Que, loc:Sep, 0)
  return(self.mLoadDirQ(pqLF, p_Path, Que, p_SkipSubDir))

tcIO.mLoadDirQ                        function(tqLF pqLF, *cstring p_Path, Queue p_Que, long p_SkipSubDir = 0)
loc:i       long
loc:szPath     cstring(255)
loc:szNewPath  cstring(255)
loc:j       long
qLF         queue(tqLF).


loc:Flag    long

loc:Mask  cstring(64)
pAny      Any


 code
 loc:Flag = pqLF.Flag

 pAny &= what(p_Que,1)

 !Сначала все поддиректории
 loc:szPath = p_Path & '*.*'
 directory(qLF, loc:szPath, ff_:directory )
 loop loc:i = 1 to records(qLF)
    get(qLF, loc:i)


    if clip(qLF.ShortName) = '..'
       cycle.
    if clip(qLF.ShortName) = '.'
       cycle.

    if band(qLF.Attrib, ff_:DIRECTORY)
       !Message(p_Path&'|'&qLF.Name,'Dir')
       if p_SkipSubDir = 0
          loc:szNewPath = p_Path & clip(qLF.Name) & '\'
          self.mLoadDirQ(pqLF, loc:szNewPath, p_Que)
       .
    .
 .

 if ~records(p_Que)
    loc:Mask = '*.*'
    do RunIt
 else
    loop loc:j = 1 to records(p_Que)
       get(p_Que, loc:j)
       loc:Mask = pAny
       do RunIt
    .
 .
 return(1)


RunIt  routine
 free(qLF)
 loc:szPath = p_Path & loc:Mask

 !Message(loc:szPath)

 directory(qLF, loc:szPath, ff_:NORMAL  + ff_:READONLY + ff_:ARCHIVE)

 loop loc:i = 1 to records(qLF)
    get(qLF, loc:i)

    if clip(qLF.ShortName) = '..'
       cycle.
    if clip(qLF.ShortName) = '.'
       cycle.

    if band(qLF.Attrib, ff_:DIRECTORY)
    else
       pqLF = qLF
       pqLF.szFullName = p_Path & clip(qLF.Name)
       pqLF.recs = 0

       pqLF.Flag = loc:flag

       add(pqLF)
    .
 .


tcIO.mStrToQue              function(*cstring p_Str, Queue p_Que, *cstring p_Sep, long p_Flag)
pAny  Any
loc:len   ulong
loc:pos   ulong
loc:currpos   ulong
loc:str    cstring(2048) 
loc:SepLen long


!loc:m  equate(500)
!loc:mx long
 code
 if ~p_Flag
   free(p_Que)
   clear(p_Que)
 .

 pAny &= what(p_Que,1)

 loc:len = len(clip(p_Str))
 loc:currpos = 1
 !Message(loc:Len)

 loc:SepLen = len(p_Sep)

 loop
   loc:pos = instring(p_Sep,p_str,1,loc:currpos)
   if ~loc:pos
      break.
   loc:Str = p_Str[loc:currpos : loc:pos - 1]&'<0>'
   loc:currpos = loc:pos + loc:Seplen
   do add_que
 .
 if loc:currpos < loc:len 
    loc:Str = p_Str[loc:currpos : loc:len]&'<0>'
    do add_que
 .

 return(0)

Add_que  routine
 loc:str = clip(loc:str)
 if len(loc:str)
    pAny = loc:str
    add(p_que)
 else
    clear(p_que)
    add(p_que)
 .

Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса

Аватара пользователя
Admin
Администратор
Сообщения: 3483
Зарегистрирован: 05 Июль 2005, 14:59
Откуда: Хабаровск
Контактная информация:

Re: Сканирование директорий ПК и сети

Сообщение Admin » 25 Март 2011, 10:37

Только там поля многие из очереди не заполняются. Тут уж надеюсь разберетесь.
Нет - пишите.

Удачи
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса

Stalker
Активист
Сообщения: 123
Зарегистрирован: 01 Декабрь 2005, 20:47
Откуда: Минск
Контактная информация:

Re: Сканирование директорий ПК и сети

Сообщение Stalker » 26 Март 2011, 11:07

Здравствуйте Admin!
Все получилось, в остальном разберусь,большое Вам спасибо за помощь. Работал в основном с шаблонами, поэтому и возникла проблема.С уважением Stalker.
Специализация - программы для образования, делопроизводство, складской учет

Ответить