MyTetra Share
Делитесь знаниями!
VBA. Копирование со структурой папок
Время создания: 16.03.2019 23:43
Раздел: !Закладки - VBA - FSO
Запись: xintrea/mytetra_db_adgaver_new/master/base/1515736667md91fvxddt/text.html на raw.githubusercontent.com

VBA. Копирование со структурой папок

Вид для печати

  • 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. Копирование со структурой папок

Вот, вот, вот -
xcopy не хочет свою работу выполнять, а MkDir за нее отдувается :)

Так же в этом разделе:
 
MyTetra Share v.0.59
Яндекс индекс цитирования