powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / WinAPI : скопировать дерево, т.е. каталог со всеми его подкаталогами и файлами.
8 сообщений из 8, страница 1 из 1
WinAPI : скопировать дерево, т.е. каталог со всеми его подкаталогами и файлами.
    #35950003
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет!
Вобщем есть необходимость копировать деревья, т.е. каталог со всем его содержимым (все подкаталоги и их файлы) по его имени в другой каталог. Есть в принципе простое решение в виде XCOPY, но интересно WinAPI решение. На сайте news2news.com я нашел пример для удаления каталога, решил переделать его под копирование:
Код: plaintext
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.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
FUNCTION CopyDirectory
LPARAMETERS tcSourceDir, tcTargetDir
* returns  0  on success or error code if fails

#define FO_MOVE           0x0001
#define FO_COPY           0x0002
#define FO_DELETE         0x0003
#define FO_RENAME         0x0004

#define FOF_MULTIDESTFILES         0x0001
#define FOF_CONFIRMMOUSE           0x0002
#define FOF_SILENT                 0x0004  && don't create progress/report
#define FOF_RENAMEONCOLLISION      0x0008
#define FOF_NOCONFIRMATION         0x0010  && Don't prompt the user.
#define FOF_WANTMAPPINGHANDLE      0x0020  && Fill in SHFILEOPSTRUCT.hNameMappings
											&& Must be freed using SHFreeNameMappings
#define FOF_ALLOWUNDO              0x0040
#define FOF_FILESONLY              0x0080  && on *.*, do only files
#define FOF_SIMPLEPROGRESS         0x0100  && means don't show names of files
#define FOF_NOCONFIRMMKDIR         0x0200  && don't confirm making any needed dirs
#define FOF_NOERRORUI              0x0400  && don't put up error UI
#define FOF_NOCOPYSECURITYATTRIBS  0x0800  && dont copy NT file Security Attributes
#define FOF_NORECURSION            0x1000  && don't recurse into directories.

    DECLARE INTEGER SHFileOperation IN Shell32 STRING @lpFileOp
 
    LOCAL loSource, loTarget, cBuffer, hWindow, nFlags
 
    loSource = CREATEOBJECT("PChar", m.tcSourceDir)
    loTarget = CREATEOBJECT("PChar", m.tcTargetDir)

    * use the GetActiveWindow with earlier VFP versions
    hWindow = _screen.HWnd
 
    * complete silent mode
    * for earlier VFP versions with limited BITOR()
    * just sum the flags together
    *nFlags = BITOR(FOF_SILENT, FOF_NOCONFIRMATION, FOF_NOERRORUI)
	*
    nFlags = BITOR(	FOF_NOCONFIRMATION, ;
					FOF_SIMPLEPROGRESS, ;
					FOF_NOCONFIRMMKDIR, ;
					FOF_NOCOPYSECURITYATTRIBS)
 
    * assembling the SHFILEOPSTRUCT structure

    cBuffer = num2dword(_screen.HWnd) +;
        num2dword(FO_COPY) +;
        num2dword(loSource.GetAddr()) +;
        num2dword(loTarget.GetAddr()) +;
        num2word(m.nFlags) +;
        num2word( 0 ) + num2dword( 0 ) + num2dword( 0 )

RETURN SHFileOperation(@cBuffer)
 
FUNCTION num2word(lnValue)
RETURN Chr(MOD(m.lnValue, 256 )) + CHR(INT(m.lnValue/ 256 ))
 
FUNCTION num2dword(lnValue)
#DEFINE m0 0x0000100
#DEFINE m1 0x0010000
#DEFINE m2 0x1000000
    IF lnValue <  0 
        lnValue = 0x100000000 + lnValue
    ENDIF
    LOCAL b0, b1, b2, b3
    b3 = Int(lnValue/m2)
    b2 = Int((lnValue - b3*m2)/m1)
    b1 = Int((lnValue - b3*m2 - b2*m1)/m0)
    b0 = Mod(lnValue, m0)
RETURN Chr(b0)+Chr(b1)+Chr(b2)+Chr(b3)
 


DEFINE CLASS PChar As Session
PROTECTED hMem
 
PROCEDURE Init(lcString)
    THIS.hMem =  0 
    THIS.setValue(lcString)
 
PROCEDURE Destroy
    THIS.ReleaseString
 
FUNCTION GetAddr
RETURN THIS.hMem
 
FUNCTION GetValue
    LOCAL lnSize, lcBuffer
    lnSize = THIS.getAllocSize()
    lcBuffer = SPACE(lnSize)
 
    IF THIS.hMem <>  0 
        DECLARE RtlMoveMemory IN kernel32 As MemToStr;
            STRING @, INTEGER, INTEGER
        = MemToStr(@lcBuffer, THIS.hMem, lnSize)
    ENDIF
RETURN lcBuffer
 
FUNCTION GetAllocSize
    DECLARE INTEGER GlobalSize IN kernel32 INTEGER hMem
RETURN Iif(THIS.hMem= 0 ,  0 , GlobalSize(THIS.hMem))
 
PROCEDURE SetValue(lcString)
#DEFINE GMEM_FIXED  0 
#DEFINE GMEM_MOVEABLE  2 
#DEFINE GMEM_ZEROINIT 0x0040
 
    THIS.ReleaseString
 
    DECLARE INTEGER GlobalAlloc IN kernel32 INTEGER, INTEGER
    DECLARE RtlMoveMemory IN kernel32 As StrToMem;
        INTEGER, STRING @, INTEGER
 
    LOCAL lnSize
    lcString = lcString + Chr( 0 ) + Chr( 0 )
    lnSize = Len(lcString)
    THIS.hMem = GlobalAlloc(0x0040, lnSize)
    IF THIS.hMem <>  0 
        = StrToMem(THIS.hMem, @lcString, lnSize)
    ENDIF
 
PROCEDURE ReleaseString
    IF THIS.hMem <>  0 
        DECLARE INTEGER GlobalFree IN kernel32 INTEGER
        = GlobalFree (THIS.hMem)
        THIS.hMem =  0 
    ENDIF
ENDDEFINE

Параметрами должны придти валидные полные пути, (к примеру, полученные getdir()) и без слеша (\) в конце. На возврате 0 если все ОК и код выньапишного ашипко если че не так.

Мож какие предложения будут по усовершенствованию?

ЗЫ Эта тема задумывалась как вопрос, т.к. у меня не получалось. Но прочитал MSDN про SHFILEOPSTRUCT и допер что надо было добавить еще один chr(0) в строке lcString = lcString + Chr(0) + Chr(0), так как там изначально только 1 был. А я поначалу пытался дважды нул добавлять после адреса строк в сборке cBuffer, что к0зило ан иксепшн
...
Рейтинг: 0 / 0
WinAPI : скопировать дерево, т.е. каталог со всеми его подкаталогами и файлами.
    #35950094
-=AlexiS=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторМож какие предложения будут по усовершенствованию?

Ну вот это чуток покороче будет


Код: plaintext
1.
oFSO=Createobject("Scripting.FileSystemObject")
oFSO.copyfolder('d:\123','d:\321',.t.)
...
Рейтинг: 0 / 0
WinAPI : скопировать дерево, т.е. каталог со всеми его подкаталогами и файлами.
    #35950224
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, согласен, видел - через vbs все решается в 2 строки.
...
Рейтинг: 0 / 0
WinAPI : скопировать дерево, т.е. каталог со всеми его подкаталогами и файлами.
    #35950301
-=AlexiS=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это на фоксе
...
Рейтинг: 0 / 0
WinAPI : скопировать дерево, т.е. каталог со всеми его подкаталогами и файлами.
    #35950337
-=AlexiS=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
WinAPI : скопировать дерево, т.е. каталог со всеми его подкаталогами и файлами.
    #35950374
-=AlexiS=-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to CTAC-KO - блин не увидел s в vbs
, подумал что написано про VB.
Если ты насчет того что через Scripting - то думаю тут разницы нет с "чистым" WinAPI .
наверняка "внутре" - там нечто похожее на приведенный тобой код.
Я особо этим не заморачиваюсь - есть удобный инструмент - я им пользуюсь.
...
Рейтинг: 0 / 0
WinAPI : скопировать дерево, т.е. каталог со всеми его подкаталогами и файлами.
    #35950556
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в моем примере, похоже, есть ошибка. Она моя отчасти, но есть. Короче смысл в том, что желательно во флагах не использовать FOF_SIMPLEPROGRESS, из-за того, что в примере на основе которого я это делал немного неправильно написана передача параметров...

2-=AlexiS=- У меня какая-то необъяснимая тяга к WinAPI... Поэтому два простых выхода через VBS и XCOPY я проигнорил, а про VBS даже не упомянул.
...
Рейтинг: 0 / 0
WinAPI : скопировать дерево, т.е. каталог со всеми его подкаталогами и файлами.
    #35950582
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо за чудесную доку по FSO!
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / WinAPI : скопировать дерево, т.е. каталог со всеми его подкаталогами и файлами.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]