- 25.11.2007 05:03Avsha
VBA. Копирование со структурой папок
Приветствую,
Уже отчаялся найти в Windows команду для копирования папки со структурой (с путем) до корневого диска.
Например, есть структура папок:
C:\Programs\Files\Path_01
C:\Programs\Files\Path_02
C:\Programs\Files\Path_03
C:\Programs\Files\Path_04
и т.д.
Необходимо скопировать папку Path_02 на сменный носитель K с cохранением всей структуры папок:
K:\Programs\Files\Path_02
Как это сделать в VBA или Windows?
- 25.11.2007 09:30bi-lya
Re: VBA. Копирование со структурой папок
Avsha, такие два варианта (в любом случае получаем полный путь и отметаем "С:\" )
1. копируем всю папку Programs со всеми вложенными папками и файлами и потом удалять лишнее. IMHO - неудобный, нужно перебирать все файлы в директории, не говоря о том, что размер Programs может быть и не маленьким
2. на К:\ последовательно создаем структуру согласно разбитого по "\" пути (если неизвестна структура изначально) и уже в нее копируем нужный файл
Что-то вроде того по 2-му[CODE]Public Sub MakeStructure()
Dim fs As FileSystemObject
Dim foldCr As Folder
Set fs = CreateObject("Scripting.FileSystemObject")
fpath = "C:\proba_1\proba_2\Проба.xls" 'получаем путь
f = Split(fpath, "\")
newFpath = "d:\"
For a = 1 To UBound(f) - 1
Set foldCr = fs.CreateFolder(newFpath & f(a))
newFpath = newFpath & f(a) & "\"
Next
fs.CopyFile fpath, newFpath
Set fs = Nothing
Set foldCr = Nothing
End Sub
[/CODE]
- 25.11.2007 11:47bi-lya
Re: VBA. Копирование со структурой папок
Oops...
Разговор-то про папки, а не файл
Но смысл тот же, я думаю, только используем .CopyFolder
- 25.11.2007 12:20Aent
Re: VBA. Копирование со структурой папок
[b]Avsha[/b], Есть стандартная команда [b]xcopy[/b]. Набираем xcopy /? и читаем:
[quote]
.............
/T Создает структуру папок, но не копирует файлы. Не поддерживает
пустые папки и подпапки. Сочетание /T /E
поддерживает пустые папки и подпапки.
.............
[/quote]
Как вызвать из VBA полагаю Вам объяснять не нужно.
- 25.11.2007 20:42Avsha
Re: VBA. Копирование со структурой папок
[B]bi-lya[/B], спасибо за отклик
Нашел вариант ручного копирования:
1. Открываем (заходим) в папку, где лежат наши исходные файлы
2. Выделить исходный путь в строке "Адрес" и копируем в подручный блокнот
С:\Programs\Files\Path_01
3. Меняем диск С на диск К и приписываем еще команду md
md K:\Programs\Files\Path_01 (забираем в буфер)
4. Пуск\Выполнить\cmd
5. Вставка из буфера команды на создание структуры папок.
6. Копирование исходных файлов в полученную структуру папок.
надеюсь, что это все можно сделать автоматически с помощью bat-файла,
который будет предварительно копироваться в исходную папку
(немного подправляться по необходимости) и просто запускаться.
Думаю, можно этот вариант будет сделать и в виде exe-шника на VB,
используя CurDir, MkDir, FileCopy и задавая один лишь аргумент - Имя буквы диска назначения(K).
to [B]Aent[/B],
ключи от xcopy честно и упорно проверял, но использовать у меня их не вышло.
Может вы подскажете, что не так.
мой неработающий вариант следующий ...
[B]xcopy С:\Programs\Files\Path_01\ K:\ /T /E[/B]
- 25.11.2007 21:39Aent
Re: VBA. Копирование со структурой папок
[quote="Avsha"]мой неработающий вариант следующий ...
xcopy С:\Programs\Files\Path_01\ K:\ /T /E[/quote]
Вы неверно указали путь.
Кстати, cначала нужно создать на диске K необходимую целевую папку.
Далее код на VBA
[code]
Sub test()
Dim rc As Long
MkDir "k:\Path_01"
rc = Shell("c:\Windows\System32\xcopy.exe ""C:\Program Files\Path01"" k:\Path_01 /T /E", 0)
End Sub
[/code]
Не забывайте, что если параметр командной строки содержит пробел, его нужно заключать в кавычки.
В нашем случае (т.к. Shell передаётся командная строка) - кавычки должны удваиваться.
Разумеется, всё легко параметризуется.
- 26.11.2007 09:59Avsha
Re: VBA. Копирование со структурой папок
Aent ,
что-то ничего у меня не работает ни в VBA, ни в cmd.
А у вас xcopy с ключами /T /E в оболочке cmd работает?
- 26.11.2007 11:31Aent
Re: VBA. Копирование со структурой папок
[quote="Avsha"]А у вас xcopy с ключами /T /E в оболочке cmd работает?[/quote]
Да. Никаких проблем. И из VBA и из командной строки. Только что проверил.
Windows XP SP2
А что у Вас происходит после команды ?
- 26.11.2007 12:36Avsha
Re: VBA. Копирование со структурой папок
Исходные папки
-----------------------
C:\Programs\Files\Path_01
E:\Path_01
cmd...
xcopy C:\Programs\Files\Path_01 E:\Path_01 /T /E
xcopy C:\Programs\Files\Path_01 E: /T /E
- ничего не сообщает, просто опять выводит приглашение ввода C:\>
если не затруднит, приведите пожалуйста вариант вашей команды xcopy в cmd.
- 26.11.2007 17:49Aent
Re: VBA. Копирование со структурой папок
[b]Avsha[/b], возможно я не совсем понял что Вам нужно.
Приведённая вами команда Xcopy
[b]xcopy C:\Programs\Files\Path_01 E:\Path_01 /T /E[/b]
копирует структуру папок (в том числе пустых), являющихся подпапками
C:\Programs\Files\Path_01, предполагая что E:\Path_01 уже существует
Т.е на диске E: в папке Path_01 будет восоздана структура подпапок одноимённой
папки с диска C:
Сообщений Xcopy принормальной работе не выдаёт.
Это же (c немного другими именами) делает и мой пример на VBA
Если вам нужно на диске E: восоздавать полный путь от корня
(E:\Programs\Files\Path_01) - это другой вопрос.
- 27.11.2007 17:42Игорь Акопян
Re: VBA. Копирование со структурой папок
добавлю что ключ /I создаст папку Path_01 если её не существует.
ещё команда [B]FOR[/B] была довольно занятна... а вообще наверное батник придётся стартовать
- 28.11.2007 01:11Aent
Re: VBA. Копирование со структурой папок
[url]https://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/xcopy.mspx?mfr=true[/url]
- 28.11.2007 14:45Игорь Акопян
Re: VBA. Копирование со структурой папок
[b]Aent[/b], xcopy хорош, но он сделает каталоги вложенные в заданный первым параметром.
/S для рекурсии забыли
- 29.11.2007 00:03Aent
Re: VBA. Копирование со структурой папок
[quote="Игорь Акопян"]он сделает каталоги вложенные в заданный первым параметром.
/S для рекурсии забыли[/quote]
??? Поясните, что Вы имеете в виду ?
/T /E - копируется [b]всё[/b] дерево подпапок. Отнюдь не только первый уровень.
- 03.12.2007 12:21Игорь Акопян
Re: VBA. Копирование со структурой папок
упс... про /S погорячился... это я перепробывался ключей :)
основной тон сообщения заключался в неприменимости xcopy для задачи топикстартера.
- 03.12.2007 19:41Aent
Re: VBA. Копирование со структурой папок
[quote="Игорь Акопян"]основной тон сообщения заключался в неприменимости xcopy для задачи топикстартера.[/quote]
Непонятно почему. Вложенные каталоги переносятся с любым разумным уровнем вложенности.
Или [b]Avsha[/b], я всё таки неправильно понял Вашу постановку задачи ?
- 03.12.2007 21:42Avsha
Re: VBA. Копирование со структурой папок
to Aent,
xcopy копирует весь пучек вложенных папок
C:\Program\Path_01
C:\Program\Path_02
C:\Program\Path_03 и т.д.
А мне требуется скопировать только [b]одну ветку с сохранением пути до корня[/b], например
C:\Program\Path_02 на
K:\Program\Path_02
А этого xcopy сделать не сможет, она построит весь пучек \Path_01, \Path_02, \Path_03
:(
Ну да ладно, считаю вопрос закрытым
ручная команда
md K:\Program\Path_02
- мне уже достаточно помогла :)
- 04.12.2007 00:07Aent
Re: VBA. Копирование со структурой папок
[b]Avsha[/b], ну так ровно это я и предлагал
[code=VB]
Sub CopyPath(sSourcePath as string)
Dim rc As Long
Dim sTargetPath as string
sTargetPath = "k:\" & Mid$(sSourcePath,4)
MkDir sTargetPath
rc = Shell("c:\Windows\System32\xcopy.exe """ & sSourcePath & """ """ & sTargetPath & """ /T /E", 0)
End Sub
[/code]
Впрочем, я всё время предполагаю, что исходные папки Path_xx cодержат подпапки...
Если это не так то конечно достаточно VBA команды MkDir. Вызов CMD (md) в этом
случае не нужен.
Впрочем, закроем тему :)
- 04.12.2007 13:57Avsha
Re: VBA. Копирование со структурой папок