purebasic.info

PureBasic forum
Текущее время: Ср окт 24, 2018 6:06 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 14 ] 
Автор Сообщение
 Заголовок сообщения: DirectoryEntryAttributes
СообщениеДобавлено: Вт май 29, 2018 8:24 pm 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 433
Благодарил (а): 50 раз.
Поблагодарили: 20 раз.
Пункты репутации: 10
Задача: рекурсивно обойти заданный каталог и записать в список только те каталоги, которые не имеют атрибута "Скрытый". Если же такой каталог встретился при переборе, то не "входить" в него (не перебирать).

почему это:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
Global dir.s = "c:\555555588888-5\"
Global NewList Path.s()
 
Procedure x(Directory$)
If Right(Directory$,1)<>"\":Directory$ + "\":EndIf
   z=ExamineDirectory(#PB_Any, Directory$, "*.*")  
  If z
    While NextDirectoryEntry(z)
     EntryName.s=DirectoryEntryName(z)
     
      If EntryName = "." Or EntryName = ".."
       Continue
      EndIf
     
      If DirectoryEntryType(z) = #PB_DirectoryEntry_Directory
        If DirectoryEntryAttributes(z) <> #PB_FileSystem_Hidden
          x(Directory$+EntryName)
        EndIf
      EndIf
     
      ;Debug Directory$+"    "+DirectoryEntryName(z)
      If Directory$ <> dir
        a=0
        ForEach Path()
          If Directory$ = Path()
            a=1
            Break
          EndIf
        Next
       
        If a=0
          AddElement(Path())
          Path() = Directory$
        EndIf
      EndIf
    Wend
    FinishDirectory(z)
  EndIf
EndProcedure
 
x(dir)
 
ForEach Path()
  Debug Path()
Next


не работает?

или же использовать GetFileAttributes? Я так понимаю она и для папок подойдёт. Вобщем, что-то ещё отсеивалось, когда вместо констант #PB_FileSystem_ писал конкретное число 32.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: DirectoryEntryAttributes
СообщениеДобавлено: Вт май 29, 2018 9:32 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11304
Благодарил (а): 4 раз.
Поблагодарили: 438 раз.
Не работает потому что у файла может быть больше одного атрибута. В справке написано.
Цитата:
To check if one attribute is actually set, just use the '&' (binary AND) and the attribute constant value:
Код:
1
2
3
4
5
  FileAttributes = DirectoryEntryAttributes(#Directory)
  If FileAttributes & #PB_FileSystem_Hidden
    Debug "This file is hidden !"
  EndIf
 

Должно быть.
Код:
1
2
3
        If DirectoryEntryAttributes(z) & #PB_FileSystem_Hidden = 0
          x(Directory$+EntryName)
        EndIf


_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: DirectoryEntryAttributes
СообщениеДобавлено: Вт май 29, 2018 9:48 pm 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 433
Благодарил (а): 50 раз.
Поблагодарили: 20 раз.
Пункты репутации: 10
Пётр, ОГРОМНОЕ спасибо!
Буду пытаться доделать, но уже не сегодня.

P.S.
А то уже было начал смотреть один "вкусный" код. Но там дебри ещё те (по крайней мере для меня).


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: DirectoryEntryAttributes
СообщениеДобавлено: Ср май 30, 2018 7:32 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 684
Благодарил (а): 75 раз.
Поблагодарили: 20 раз.
Пункты репутации: 5
может поможет, выдрал рабочий кусок
Код:
1
2
3
4
5
6
;#PB_FileSystem_Hidden    : Файл скрытый
;#PB_FileSystem_Archive   : Файл архивировался и не был изменён с того момента
;#PB_FileSystem_Compressed: Файл сжатый
;#PB_FileSystem_Normal    : Обычные атрибуты
;#PB_FileSystem_ReadOnly  : Файл в режиме только для чтения
;#PB_FileSystem_System    : Файл системный


Код:
1
2
3
4
5
6
7
8
9
If f & #PB_FileSystem_Hidden     :s+"File System Hidden|"    :a+#PB_FileSystem_Hidden   :EndIf
If f & #PB_FileSystem_Archive    :s+"File System Archive|"   :a+#PB_FileSystem_Archive:EndIf
If f & #PB_FileSystem_Compressed :s+"File System Compressed|":a+#PB_FileSystem_Compressed:EndIf
If f & #PB_FileSystem_Normal     :s+"File System Normal|"    :a+#PB_FileSystem_Normal:EndIf
If f & #PB_FileSystem_ReadOnly   :s+"File System ReadOnly|"  :EndIf; пока его игнорим
If f & #PB_FileSystem_System     :s+"File System System"     :a+#PB_FileSystem_System:EndIf
; если есть запрещающие атрибуты, спрашиваем разрешения на перезапись
If f&#PB_FileSystem_ReadOnly Or f&#PB_FileSystem_Hidden Or f&#PB_FileSystem_System
s=RTrim(s, "|"); последняя всегда лишняя


строка для показа челу, а число для записи в файл


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: DirectoryEntryAttributes
СообщениеДобавлено: Ср май 30, 2018 5:35 pm 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 433
Благодарил (а): 50 раз.
Поблагодарили: 20 раз.
Пункты репутации: 10
newJS, спасибо. Ценю.

Никак не совладаю с задачей. Сначала выложу код, а после попытаюсь объяснить какого результата хочу добиться.
Пётр, kvitaliy и другие участники форума(профессора, доценты и пр.), не проходите мимо. Прошу вашей помощи.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
Global NewList Path.s()
Global NewList hidden.s()
Global dir.s = ""
 
Procedure x(Directory$)
If Right(Directory$,1)<>"\":Directory$ + "\":EndIf
   z=ExamineDirectory(#PB_Any, Directory$, "*.*")  
  If z
    While NextDirectoryEntry(z)
     EntryName.s=DirectoryEntryName(z)
     
      If EntryName = "." Or EntryName = ".."
       Continue
      EndIf
     
      If DirectoryEntryType(z) = #PB_DirectoryEntry_Directory
        If DirectoryEntryAttributes(z) & #PB_FileSystem_Hidden = 0
          x(Directory$+EntryName)
        Else
          AddElement(hidden())
          hidden() = Directory$
        EndIf
      EndIf
     
      ;Debug Directory$+"    "+DirectoryEntryName(z)
      If Directory$ <> dir
          a=0
          ForEach Path()
            If Directory$ = Path()
              a=1
              Break
            EndIf
          Next
       
          If a=0
            AddElement(Path())
            Path() = Directory$
          EndIf
        EndIf
    Wend
    FinishDirectory(z)
  EndIf
EndProcedure
 
 
NewList RootFolders.s()
 
Directory$ = "c:\TASTE\"
 
If ExamineDirectory(1, Directory$, "*.*")
  While NextDirectoryEntry(1)
    If DirectoryEntryType(1) = #PB_DirectoryEntry_Directory
      EntryName.s = DirectoryEntryName(1)
      If EntryName <> "." And EntryName <> ".."
        If DirectoryEntryAttributes(1) & #PB_FileSystem_Hidden = 0
          AddElement(RootFolders())
          RootFolders() = Directory$ + EntryName + "\"
        EndIf
      EndIf
    EndIf
  Wend
  FinishDirectory(1)
EndIf
 
If ListSize(RootFolders())=0
  MessageRequester("Error", "Не найдены каталоги" + #CRLF$ + "для копирования.")
  End
EndIf
 
ForEach RootFolders()
  dir = RootFolders()
  x(RootFolders())
Next
 
ForEach Path()
  ForEach hidden()
    If Path() = hidden()
      DeleteElement(Path())
    EndIf
  Next
Next
 
ForEach Path()
  Debug Path()
Next
 


это примитивное, неполное и к тому же не совсем рабочее решение.
Пояснение: пользователь задаёт корневой каталог, структура которого (глубина вложений) нам заранее неизвестна. Сначала "щупаем" папки в "корне" (скрытые сразу же отсеиваются). Здесь всё нормально! Далее нужно рекурсивно пройтись по всем нескрытым корневым каталогам. Да так..., чтобы получить следующий список:

пример:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
c:\TASTE\KM\---\
c:\TASTE\KM\---\images\
c:\TASTE\KM\---\images\patterns\
c:\TASTE\KM\---\www\assets\
c:\TASTE\KM\---\www\contrib\
c:\TASTE\KM\---\www\Magick++\
c:\TASTE\KM\---\www\source\
c:\TASTE\KM\---\www\source\core\
c:\TASTE\KM\---\www\source\wand\
c:\TASTE\KM\unzip\copy\CORE\
c:\TASTE\KM\unzip\copy\
c:\TASTE\KM\unzip\
 


неправильный. Здесь не видно, но поясню, что эелемента с сожержимым "c:\TASTE\KM\---\" не должно было быть. Потому, что по этому пути (во вложениях) присутствуют скрытые папки. Таким образом я частично! смог избавиться от подобного элемента "c:\TASTE\KM\---\www\". Этот каталог содержит в себе скрытую папку "api" (путь: "c:\TASTE\KM\---\www\api\"). А так как папка "www" в конечном итоге находится по пути "c:\TASTE\KM\---\", то и последнего не должно было быть в таком виде. Но это нужно проверять на всех уровнях (вхождениях/итерациях).
И наоборот, если какая-либо корневая(относительно очередного вхождения) папка не содержит скрытых подкаталогов, то её(папку не надо расписывать). То есть добавлять в список все подкаталоги, которые она содержит. Иными словами "Свернуть" узел, если представить мысленно TreeGadget.

не содержит скрытых каталогов "c:\TASTE\KM\unzip\", ровно как и "c:\TASTE\KM\---\images\" и "c:\TASTE\KM\---\www\source\". Поэтому "сворачиваем" их, а вот "c:\TASTE\KM\---\" наоборот "разворачиваем".
Таким образом на выходе должно было быть так:
Код:
1
2
3
4
5
6
7
c:\TASTE\KM\---\images\     ; не интересует что там внутри, так как не содержит скрытых подкаталогов
c:\TASTE\KM\---\www\assets\    ; а вот "c:\TASTE\KM\---\www\" наоборот надо развернуть, так как рядом с папкой "c:\TASTE\KM\---\www\assets\" лежит скрытая "c:\TASTE\KM\---\www\api\"
c:\TASTE\KM\---\www\contrib\
c:\TASTE\KM\---\www\Magick++\
c:\TASTE\KM\---\www\source\    ; не интересует что там внутри, так как не содержит скрытых подкаталогов
c:\TASTE\KM\unzip\    ; не интересует что там внутри, так как не содержит скрытых подкаталогов
 



Нужно это для того, чтобы впоследствии можно было "скормить" такой список программе копирования.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: DirectoryEntryAttributes
СообщениеДобавлено: Чт май 31, 2018 5:12 pm 
Не в сети
профессор

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 230
Благодарил (а): 1 раз.
Поблагодарили: 7 раз.
Пункты репутации: 0
Вот держи.
Оформиш как процедуру, вхождений в процедуру у тебя это так x(Directory$+EntryName)
масив и нумерация индекса в этом масиве должны быть глобальными

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Dim fil$(1000)
 
Debug ExamineDirectory(1,"C:\","*.*")
; тут кажется процедура начинается
I=0
For I=0 To 1000
    A=NextDirectoryEntry(1);
    If A=0 :Break:EndIf; тут ты должен выйти из процедуры(папки и файлы окончились, но это я  делал для цикла, а тебе переделать для процедуры(мож поставить метку в конце и гото))
    a=DirectoryEntryType(1);если пурик старый эту строку закоментируй
    A$=""
    If A=2: A$="ПАПКА ["+DirectoryEntryName(1)+"]"
    Else:   A$="ФАЙЛ "+DirectoryEntryName(1)
    EndIf
    atr=DirectoryEntryAttributes(1)
    A$=Str(a)+" "+A$+" "+Str( atr)+" "
    ;блин приколы пурика меня достали ЕНТИ две строки ниже(их нужно удалить они неиспользуются)
    ;5 версия компилит без ошибок и я туплю какой тип строку или число выдает эта хвункция
    A1$=A$+Str(DirectoryEntryAttributes(1))
    A2$=A$+    DirectoryEntryAttributes(1); это как понять? ЧЁ ЭТО ЗА ФОКУСЫ?
       
    A$=A$+Str(atr&$12);18 -папка и скрытая
    If atr&$10=16: Debug "+++НИЖЕ НАЙДЕНА ПАПКА++++"
        If atr&$12=18: Debug "+++НИЖЕ НАЙДЕНА СКРЫТАЯ ПАПКА ее пропускаем++++"
            Else:  fil$(i2)=DirectoryEntryName(1) :i2+1:  Debug Str(i2)+"+++++++++++"
; в этом месте вызываеш типа повторноно входа, у тебя это выглядит так x(Directory$+EntryName)
        EndIf
    EndIf
    Debug A$
Next
 
Debug ""
Debug "-----------готовый список--------------"
Debug ""
 
For i=0 To i2
    Debug fil$(i)
   
Next


_________________
искатель истины


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: DirectoryEntryAttributes
СообщениеДобавлено: Чт май 31, 2018 5:27 pm 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 433
Благодарил (а): 50 раз.
Поблагодарили: 20 раз.
Пункты репутации: 10
balex1978
Кхм... спасибо конечно, но это совсем не то... (без обид).

Пётр!
???

добился таки разворачивания нужных узлов(точнее удаления из списка "корневых" путей со скрытыми папками), а вот как свернуть те, которые не содержат скрытых папок(чтобы без конкретики) - никак не соображу. Извини, я плохо изъясняюсь, но ведь по коду видно чего добиваюсь.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: DirectoryEntryAttributes
СообщениеДобавлено: Пт июн 01, 2018 10:12 am 
Не в сети
профессор

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 230
Благодарил (а): 1 раз.
Поблагодарили: 7 раз.
Пункты репутации: 0
Просто я вижу непонятности в последнем вопросе с примерами и в первом, мне показалось что они противоречат, если опишеш папки скрытые и нескрытые и чего нужно показать в списке, а чего непоказывать то станет понятнее(а то у меня путаница получилась, и прогу делал только для одной паки без вложеных). И на сколько я понял тебе нужно пройтись по папкам и пропускать скрытые и невходить в них или я чегото напутал.

Еще вопрос к Петру и другим по приколам что в коде выше, вот еще нарыл, если разкоментировать по очереди. В строковую переменную присваиваю числовую даже непереводя в строку и все нормально, это как. Ет типа как в пурике 3 версии любую константу можно сменить ее значение присвоив новое, чем я немного был удивлен.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
OpenConsole("")
 
a$="разноШЁРСНЫЕ типы, давно пометил чё Debug-у побарабану некоторые фокусы";; например
Debug a$; это строковая переменная
 
a=5:
Debug a;эт числовая пер. и неругается хотя должно быть так:
Debug Str(a)
PrintN(a$);вроде строковая
PrintN(" 'a' и 'бе' сидели на ТРУ-БЕ, 'А' ОТПАЛО, 'бе'...!!!"); и тут тож
;PrintN(a);а тут ошибка. "Неверный тип: строка не ожидалась"(мож я туплю но вот какраз строка должна)
PrintN(Str(a))
;a$=ElapsedMilliseconds(); вот этот фокус непроходит
a$=""
a$ +ElapsedMilliseconds() ; а этот аж со свистом пролетает
B$ +ElapsedMilliseconds()
B.L=ElapsedMilliseconds()
 
;n=Val(ElapsedMilliseconds());ЕРОР:строка неожидалась, подвоха невижу
PrintN(Str(ElapsedMilliseconds()))
;PrintN(ElapsedMilliseconds()); опять строка неожидалась
Debug a$
Debug B$
Debug B.L
 
a=Val("12")
;a=Val(12);"Неверный тип: строка не ожидалась"
; мне всегда казалось, что он гонит с типами, но тут точно, возможно это перевод
Input()
 
;розкрментируй строку и проверь, что за ошибку выдает
;a=Val(12);у меня такой текст"Неверный тип: строка не ожидалась"
 
; собственно из журнала ошибок:
; [22:57:00] [COMPILER] Строка 27: Неверный тип: строка не ожидалась.
; [22:57:50] [COMPILER] Line 27: Bad parameter type: a string is expected.
; плохо знаю инглиш, переводчик глаголит, что я прав-Плохой тип параметра: строка ожидается.
; выходит перевод кривой.
; У меня вопрос это только уменя такой русификатор или это везде




Ниже еще вопрос, значит заметил что пурик ругается некоректными ошибками
если розкоментировать каждую группу отдельно то выдает такой кривой перевод.
В связи с этим вопрос это у меня кривой русификатор или у всех?
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
; For I=0 To 5
;     ; [23:15:12] [COMPILER] Строка 3: В конце следующего условия отсутствует дескриптор: Next.
; забавно что строка берется не где стоит начало цикла т. е. For, а там где трудно понять, чего ему нехватает.
; это касается и других
; У други басиках For без Next, тут какойто дескриптор
 
; Next
; ; [23:11:51] [COMPILER] Строка 1: 'Next' отсутствует 'For'.
 
 
;EndWith; код ошибки  196= 'EndWith' отсутствует 'With'.
;With A;[23:27:59] [COMPILER] Строка 19: 'EndWith'отсутствует.
 
 
; Return
; [23:22:40] [ОШИБКА] Невозможен доступ к памяти. (ошибка чтения по адресу 28684288)
;Во , у других бейсиках выскакивало сообщение Return без Gosub
 
;If f=0;[23:36:44] [COMPILER] Строка 23: В конце следующего условия отсутствует дескриптор: EndIf.
 
;Select q;[23:37:52] [COMPILER] Строка 26: В конце следующего условия отсутствует дескриптор: EndSelect.
;и чего ему везде мерещется 'дескриптор'.
; у меня вопрос как его в смысле слово - 'дескриптор' коректно перевести, потому что шаблон ошибки такой:
;В конце следующего условия отсутствует дескриптор: а тут он сам подставляет чего нехватило
; поэтому слова могут быть разными, может так
;В конце следующего условия отсутствует команда:
 
; If s=3
; ElseIf s=4;  тут очередная ош с номером строки
; ;[23:41:21] [COMPILER] Строка 31: В конце следующего условия отсутствует дескриптор: EndIf.
 
; Select q
;     Case 4
;;тут 2 ошибки, указал на последнюю строку(она пуста), а надо на Select q
;; и наверно нада типа название ошибки-" в 'Select' отсутствует 'EndSelect' "
; ;[23:43:51] [COMPILER] Строка 34: Незавершенное условие.
 
 
На пурике 3.9 только инглиш
; For I=0 To 5
; ;Next
; ;[23:59:19] [COMPILER] Line 6: The following End condition keyword is missing: Next
;; кривой перевод :Следующее Конечное ключевое слово условия(состояния) отсутствует:
 
; Next
; [00:00:00] [COMPILER] Line 6: 'Next' without 'For'
; ; вот тут правильно перевел с инглиша 'Next' без 'For'
; ; ГЫ, забавно и надо было так попасть на 00 сек



Петр или newJS или kvitaliy если можете скиньте в архиве папку с пурика Catalogs с руским переводом где содержатся файлики Compiler.catalog , Debugger.catalog, Editor.catalog, хочу сравнить

_________________
искатель истины


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: DirectoryEntryAttributes
СообщениеДобавлено: Пт июн 01, 2018 12:30 pm 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 433
Благодарил (а): 50 раз.
Поблагодарили: 20 раз.
Пункты репутации: 10
Если это поможет, то мне совсем не трудно повторить задачу.

Итак...
Есть некий каталог, который определяется пользователем. Принимаем его за "корень". Естественно в этом "корне" присутствуют подкаталоги, количество и структура которых заранее нам неизвестны. Далее... пользователь по своему усмотрению делает некоторые из них скрытыми (например, не хочет делиться, так как всё это является подготовкой списка путей перед процессом копирования на сетевой ресурс). Усугубляет ситуацию то, что заранее неизвестно на какой глубине и сколько каталогов пользователю заблагорассудится отметить как "Скрытая". Задача может показаться простой на первый взгляд (может поэтому и не хотят поучаствовать профессора), однако это не так. Не получается создать список должным образом.

Повторюсь, с рекурсивным обходом всех папок и выяснением какая из них скрытая сложностей не испытываю (есть нормально работающий код, чуток другой нежели тот, который выкладывал выше). Самое интересное начинается далее.
Постараюсь объяснить. Допустим юзер выбрал папку "c:\TASTE\". Следовательно для программы она есть "корень". Дальше вы видели, что сразу отбрасываю скрытые папки, которые в "корне" (на первом уровне). И потом уже собственно рекурсия. Допустим имеем на диске следующую структуру папок ("как она есть"):

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
C:\TASTE
├───ABC
│   ├───BV_Recent_and_Settings
│   │   ├───-= Hmm =-
│   │   └───SKEL
│   └───plugins
└───KM
    ├───unzip
    │   └───copy
    │       └───CORE
    └───ZZZ
        ├───images
        │   └───patterns
        └───www
            ├───api
            │   ├───MagickCore
            │   └───MagickWand
            ├───assets
            ├───contrib
            ├───Magick++
            ├───source
            │   ├───core
            │   └───wand
            ├───zxzx


из которых каталог "ABC" ("c:\TASTE\ABC\") и "api" ("c:\TASTE\KM\ZZZ\www\api\") являются скрытыми. К слову сказать консольная tree не видит скрытых каталогов. После того как отработал код, получаю следующий список:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
c:\TASTE\KM\unzip\
c:\TASTE\KM\unzip\copy\
c:\TASTE\KM\unzip\copy\CORE\
c:\TASTE\KM\ZZZ\images\
c:\TASTE\KM\ZZZ\images\patterns\
c:\TASTE\KM\ZZZ\www\assets\
c:\TASTE\KM\ZZZ\www\contrib\
c:\TASTE\KM\ZZZ\www\Magick++\
c:\TASTE\KM\ZZZ\www\source\
c:\TASTE\KM\ZZZ\www\source\core\
c:\TASTE\KM\ZZZ\www\source\wand\
c:\TASTE\KM\ZZZ\www\zxzx\
 


И всё бы ничего (всё вроде правильно), так как отстутствуют в списке вышеоговоренные скрытые папки, однако список неправильный (избыточный). Как вы понимаете такой список нельзя/неправильно передавать процессу копирования. А всё из-за "повторяющихся" (избыточных) путей. Выше уже применял термин/определение "узел" из treegadget'a. Он здесь подходит как нельзя кстати, так как вполне отражает суть проблемы. Просто нужно представить себе это дерево. Уже говорил, что те узлы, которые содержат в себе скрытые папки нужно развернуть/раскрыть. Сам узел при этом из списка надо удалить. Этого удалось достичь. Из списка выше это видно. Отсутствуют такие элементы, как например "c:\TASTE\KM\", "c:\TASTE\KM\ZZZ\" и "c:\TASTE\KM\ZZZ\www\" так как по пути "c:\TASTE\KM\ZZZ\www\" имеется скрытая "api" и соостветственно их никак нельзя добавлять в список (нужно как бы конкретизировать пути в таком случае). Иначе скопируется и скрытая "api". А ведь эти папки изначально также попали в результирующий список, но удалось их отсеять.
Не получается же обратная операция (не представляю алгоритм) по сворачиванию узлов. Например, хорошо видно, что папка "source" ("c:\TASTE\KM\ZZZ\www\source\") содержит в себе два подкаталога "core" и "wand". Также мы выяснили (в процессе сканирования), что ни одна из них не является скрытой. Следовытельно... в итоговом списке нет нужды записывать этот узел в развёрнутом виде, как то:
Код:
1
2
3
c:\TASTE\KM\ZZZ\www\source\
c:\TASTE\KM\ZZZ\www\source\core\
c:\TASTE\KM\ZZZ\www\source\wand\


достаточно и правильно будет записать только один элемент списка, как: "c:\TASTE\KM\ZZZ\www\source\". Подняться на уровень выше(свернуть узел "www") - уже нельзя, так как в нём уже содержится скрытая папка "api".
В конечном итоге добиваюсь такого правильного списка:
Код:
1
2
3
4
5
6
7
8
9
10
c:\TASTE\KM\unzip\   ; свёрнутый узел (некчему конкретика, так как не содержит в себе скрытых папок)
c:\TASTE\KM\ZZZ\images\  ; то же самое. свёрнутый узел.
 
;узел www и уровни выше (вплоть до "корня") должны быть развёрнуты (конкретизировать пути).
c:\TASTE\KM\ZZZ\www\assets\
c:\TASTE\KM\ZZZ\www\contrib\
c:\TASTE\KM\ZZZ\www\Magick++\
c:\TASTE\KM\ZZZ\www\source\   ; свёрнутый узел
c:\TASTE\KM\ZZZ\www\zxzx\
 


Такая вот задача. Надеюсь, что хоть теперь кто-нибудь выскажет свои соображения по этому поводу.

P.S. только сейчас пришло в голову использовать стороннюю программу копирования (а точнее её ключи). Чего голову морочить с "процеживанием комаров", когда robocopy умеет копировать только то, чего недостаёт в "приёмнике". Соответственно можно смело пренебречь повторами в списке путей (они благополучно будут проигнорированы).

И всё-таки ещё жду советов и помощи от старших (маститых гуру).


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: DirectoryEntryAttributes
СообщениеДобавлено: Пт июн 01, 2018 12:49 pm 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 433
Благодарил (а): 50 раз.
Поблагодарили: 20 раз.
Пункты репутации: 10
balex1978
Цитата:
нужно пройтись по папкам и пропускать скрытые и невходить в них или я чегото напутал.

Всё именно так. Ничего не напутал (именно не входить!).
Причина: сама папка может быть скрытой, а вот её содержимое (включая подпапки) вполне себе могут быть и нескрытыми. И вот, чтобы их ненароком не захватить и было поставлено условие: Не входить!

То есть пользователю достаточно выставить атрибут "скрытая" только у узла (не обязательно применять изменения ко всему содержимому - спрашивает обычно проводник) и всё. Узла со всеми его "потрохами" в списке не будет. Не знаю, возможно там "тонна" подкаталогов и файлов будет и процесс "перебивания" атрибутов у всего этого содержимого займёт длительное время. Просто так просили сделать изначально.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: DirectoryEntryAttributes
СообщениеДобавлено: Пт июн 01, 2018 2:49 pm 
Не в сети
профессор

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 230
Благодарил (а): 1 раз.
Поблагодарили: 7 раз.
Пункты репутации: 0
собственно моя прога так и делает, только в подкаталоги нелезет, эта часть задания у тебя уже есть, тебе просто осталось схрестить мой код со своим, если время будить то немного посмотрю, результат выложу попоже, я буду ориентироваться на то чтобы несканировать все папки в скрытой папке и эту скрытую невводить в список, если че нетак понял пиши, а пока пошел работать.
Просто я когдато делал поисковик файлов и перебирал их всех в блокнот, такая себе индексация винта, это упрощает поиск нужного файла потом открываю в НОТЕПАД++ все записи и быстро ищю любой файл. А также на основе него сделал примитивный поискавик копий.

_________________
искатель истины


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: DirectoryEntryAttributes
СообщениеДобавлено: Сб июн 02, 2018 4:40 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 684
Благодарил (а): 75 раз.
Поблагодарили: 20 раз.
Пункты репутации: 5
knower писал(а):
То есть пользователю достаточно выставить атрибут "скрытая" только у узла (не обязательно применять изменения ко всему содержимому - спрашивает обычно проводник) и всё. Узла со всеми его "потрохами" в списке не будет. Не знаю, возможно там "тонна" подкаталогов и файлов будет и процесс "перебивания" атрибутов у всего этого содержимого займёт длительное время. Просто так просили сделать изначально.

тоталь всё обрабатывает с одного пинка, а левые проги на то и левые, чтобы ни чего не уметь :D


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: DirectoryEntryAttributes
СообщениеДобавлено: Сб июн 02, 2018 8:02 pm 
Не в сети
профессор

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 230
Благодарил (а): 1 раз.
Поблагодарили: 7 раз.
Пункты репутации: 0
newJS писал(а):
тоталь всё обрабатывает с одного пинка
мож новой версии и так, но в 7 находит файлы в скрытых папках, а ему точно это ненужно, хотя может я неверно настроил поиск. Помучился я с переделкой со сторой версии, в додаток потестил на папке винды, результат немного подудивил.
С включеным отладчиком доходит до загадочной папки папки C:\WINDOWS\assembly\NativeImages_v2.0.50727_32\dfsvc\ и выскакивает системное сообщение, что моя прога PureBasic_Compilation25.exe слитела и нужно проверить винт :shock: , ну я в шёке немного, непонял ЧЕГО случилось.
Без отладчика прога продолжает сканировать остальное без проблем но сообщение тоже самое!!! почемуто прога слетает на NextDirectoryEntry()
[19:46:43] [ОШИБКА] создать список папок(нескрытых) ПБ5.pb (Строка: 10)
[19:46:43] [ОШИБКА] The specified #Directory is not initialised.
к стати тотал в папке C:\WINDOWS\assembly невидит ничего, а винда вместо привычного вида показала какойто список, я такого невидел никогда фотка ниже.

Короче вот тебе код, сканирует указаную тобой папку выводит в ListViewGadget() в переменно FulDir$, скрытых невыводит в список и несканирует их.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
Global podurovenDir,kolpapok
 
Procedure SCAN(PolnajaDirectoryja$)
    ExamineDirectory(podurovenDir,PolnajaDirectoryja$,"*.*");загрузить даные директории
    WindowEvent(); это нужно чтоб прога при длительном сканировании неподвисала
SCAN:
   NextDir=NextDirectoryEntry(podurovenDir);следующая запись
    If NextDir=0 :Goto SCAN1:EndIf;список папок/файлов закончен
     NextDir=DirectoryEntryType(podurovenDir);если пурик старый эту строку закоментируй
    If NextDir=2:;найдена папка
        If DirectoryEntryName(podurovenDir)="." Or DirectoryEntryName(podurovenDir)="..";пропускаем точки возврата с папки
        Else:
            StatusBarText(0, 0,PolnajaDirectoryja$ ):;в статус бар выводим путь ввесь, кроме последнего
            FulDir$=PolnajaDirectoryja$+"\"+DirectoryEntryName(podurovenDir)
            atr=DirectoryEntryAttributes(podurovenDir)
            If atr&$10=$10: ;Debug "     +++НИЖЕ НАЙДЕНА ПАПКА++++"
                If atr&$12=$12:;$12 -папка и при этом скрытая
                    Debug "*папка скрытая*  "+FulDir$;это в дебугере отражает те папки которые пропустил
                Else:  
                    AddGadgetItem(1,-1,FulDir$)
                    podurovenDir=podurovenDir+1:kolpapok=kolpapok+1
                    SCAN(PolnajaDirectoryja$+"\"+DirectoryEntryName(podurovenDir-1))
                EndIf
            EndIf
            ;       UseDirectory(podurovenDir);это од старого пурика
        EndIf
    EndIf
    Goto SCAN
SCAN1:
    podurovenDir=podurovenDir-1
EndProcedure
 
;-START_PROGRAMM:
If OpenWindow(0,300,150,400,500 ,"123",#PB_Window_SystemMenu|#PB_Window_MinimizeGadget| #PB_Window_BorderLess); And CreateGadgetList(WindowID(0))
Else:End
EndIf
    ListViewGadget(1,0,0,400,480); AddGadgetItem(1,-1,"123")
    If CreateStatusBar(0, WindowID(0))
        AddStatusBarField(300):StatusBarText(0, 0, "Area 1");???
    EndIf
 
podurovenDir=0:
a$="C:\TASTE";a$="C:\Documents And Settings";a$="C:\WINDOWS"
        WindowEvent()
SCAN(a$)
AddGadgetItem(1,-1,"папок="+Str(kolpapok))
;-Repeat
Repeat : w=WaitWindowEvent()
Until w=#PB_Event_CloseWindow
End
;PureBasic_Compilation25.exe
;C:\WINDOWS\assembly\NativeImages_v2.0.50727_32\dfsvc\



Вложения:
2018.06.02-19-21-01.jpg [234.81 KiB]
Скачиваний: 0

_________________
искатель истины
Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: DirectoryEntryAttributes
СообщениеДобавлено: Сб июн 02, 2018 8:45 pm 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 433
Благодарил (а): 50 раз.
Поблагодарили: 20 раз.
Пункты репутации: 10
balex1978, спасибо тебе большое, человеческое за участие и желание помочь. Более не интересует эта тема, так как поставленная задача решена. Не Total'ом и не какими-либо "труЪ" утилитами (по кайней мере основная часть реализована в программе вручную). Другой подход, который существенно упростил решение. Хорошего всем времени суток.


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 14 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB