Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.03.2011, 18:50   #1
Andr3000
 
Регистрация: 22.04.2010
Сообщений: 6
По умолчанию Прога для синхронизации каталогов

Возникла необходимость в проге, которая бы синхронизировала 2 каталога, но новые файлы с источника бросала в еще один каталог. Структура файла: 33ххyyzz.99k (хх - код от 01 до 83, yy - дата, zz - месяц, k - 3 варианта: ничего, любой символ англ.алфавита, спецсимволы !@#$). Написал такую прогу:

Код:
Option Explicit
Dim mass_n(1 To 10000) As Variant
Dim mass_c(1 To 10000) As Variant
Dim papkan As String
Dim papkac As String
Dim papkad As String
Dim file_n As String
Dim file_c As String
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim l As Integer
Dim m As Integer

Sub синхронизация()

'задаются пути папок для сравнения
papkan = "z:\mail.in\33\" 'сетевая папка - источник
papkac = "d:\pochta\mail.in\33\" 'локальная папка - получатель
papkad = "d:\pochta\" 'добавочная папка - получатель

'очистка массивов
Erase mass_n
Erase mass_c

'считывается первое имя файла в массив-источник
file_n = Dir(papkan & "*.*")
mass_n(1) = file_n
    For j = 1 To 10000 'через цикл заносятся остальные имена файлов
file_n = Dir
If file_n = "" Then GoTo kon
mass_n(j + 1) = file_n
    Next j
kon:
'считывается первое имя файла в массив-получатель
file_c = Dir(papkac & "*.*")
mass_c(1) = file_c
    For k = 1 To 10000 'через цикл заносятся остальные имена файлов
file_c = Dir
If file_c = "" Then GoTo kon2
mass_c(k + 1) = file_c
    Next k
kon2:

l = 1 'этими значениями компенсируются передвижки в процессе синхронизации
m = 1

For i = 1 To 10000 'цикл для поэлементного сравнения двух массивов

'считывание из массивов
file_n = mass_n(l)
file_c = mass_c(m)

If file_n = "" Then 'счетчик пустых значений в массивах для выхода и удаление в получателе если в источнике пусто
    If file_c = "" Then GoTo kon5
Kill (papkac & file_c)
m = m + 1 'берется следующий файл в массиве-получателе, в массиве-источнике остается тот же
GoTo kon4
End If

If file_n > file_c Then 'если файла в получателе нет в источнике, удаление из получателя
    If file_c = "" Then GoTo kon3:
Kill (papkac & file_c)
m = m + 1 'берется следующий файл в массиве-получателе, в массиве-источнике остается тот же
GoTo kon4
End If
    If file_n < file_c Then 'если файла в источнике нет в получателе, копирование в получателя
kon3:
    FileCopy papkan + file_n, papkac + file_n
    FileCopy papkan + file_n, papkad + file_n 'добавочное копирование новых в отдельную папку для их просмотра
    l = l + 1 'берется следующий файл в массиве-источнике, в массиве-получателе остается тот же
    GoTo kon4
    End If

l = l + 1
m = m + 1

kon4:
Next i

kon5:
MsgBox ("готово") 'тут будет таймер

End Sub


Прога работает, и довольно быстро, но чувствую что я ее коряво написал. Нужен совет - можно ли ее как-то улучшить (я нуб в написании программ, эту прогу 2 дня писал, правда в голове она с месяц зрела )
Andr3000 вне форума Ответить с цитированием
Старый 29.03.2011, 19:58   #2
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

пробуйте так:
Код:
Sub синхронизация()
  'задаются пути папок для сравнения
  Const papkan As String = "z:\mail.in\33\" 'сетевая папка - источник
  Const papkac As String = "d:\pochta\mail.in\33\" 'локальная папка - получатель
  Const papkad As String = "d:\pochta\" 'добавочная папка - получатель
  Dim m(1 To 10000) As Variant
  Dim i As Integer

  i = 1
  m(i) = Dir(papkan & "*.*")
  If m(i) = "" Then Exit Sub
  For i = 2 To 10000 'через цикл заносятся остальные имена файлов
    m(i) = Dir
    If m(i) = "" Then Exit For
  Next i
  For i = 1 To i - 1
    If Dir(papkac & m(i)) = "" Then
      FileCopy papkan + m(i), papkac + m(i)
      FileCopy papkan + m(i), papkad + m(i) 'добавочное копирование новых в отдельную папку для их просмотра
    End If
  Next i
  MsgBox ("готово") 'тут будет таймер
End Sub
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 30.03.2011, 12:59   #3
Andr3000
 
Регистрация: 22.04.2010
Сообщений: 6
По умолчанию

Класс, я не додумался, что можно dir использовать совместно с if, и принцип сравнения просто обалденный. Большое спс.
Походу еще маленький вопрос - надо удалять из получателя те файлы, которых нет в источнике (полную синхронизацию). Я увидел только один путь - ввел еще один массив и сделал сравнение с удалением:

Код:
Sub синхронизация_ok()
  'задаются пути папок для сравнения
  Const papkan As String = "z:\mail.in\33\" 'сетевая папка - источник
  Const papkac As String = "d:\pochta\mail.in\33\" 'локальная папка - получатель
  Const papkad As String = "d:\pochta\" 'добавочная папка - получатель
  Dim m(1 To 10000) As Variant
  Dim n(1 To 10000) As Variant
  Dim i As Integer
  Dim j As Integer

  i = 1
  m(i) = Dir(papkan & "*.*")
  If m(i) = "" Then Exit Sub
  For i = 2 To 10000 'через цикл заносятся остальные имена файлов
    m(i) = Dir
    If m(i) = "" Then Exit For
  Next i
  For i = 1 To i - 1
    If Dir(papkac & m(i)) = "" Then
      FileCopy papkan + m(i), papkac + m(i)
      FileCopy papkan + m(i), papkad + m(i) 'добавочное копирование новых в отдельную папку для их просмотра
    End If
  Next i
  
  'блок удаления файлов из получателя, которых нет в источнике
    j = 1
  n(j) = Dir(papkac & "*.*")
  If n(j) = "" Then Exit Sub
  For j = 2 To 10000 'через цикл заносятся остальные имена файлов
    n(j) = Dir
    If n(j) = "" Then Exit For
  Next j
  For j = 1 To j - 1
    If Dir(papkan & n(j)) = "" Then
      Kill (papkac & n(j))
    End If
  Next j
  
  MsgBox ("готово") 'тут будет таймер
End Sub
Andr3000 вне форума Ответить с цитированием
Старый 30.03.2011, 13:14   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Походу еще маленький вопрос - надо удалять из получателя те файлы, которых нет в источнике (полную синхронизацию)
Вопрос немного не в тему:
а зачем для этих целей писать макрос?
Вроде бы, в Windows есть встроенные средства для синхронизации папок, да и готовых программ (причем, бесплатных) для этих целей в интернете множество.
Чем существующие решения не устраивают?
EducatedFool вне форума Ответить с цитированием
Старый 30.03.2011, 14:11   #5
Andr3000
 
Регистрация: 22.04.2010
Сообщений: 6
По умолчанию

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

Я ее сделал, но мне не хватило опыта чтобы сделать ее красиво (а вариант, который сделал IgorGO - красиво сделан)
Andr3000 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Особенности вертикальной синхронизации Lotles Компьютерное железо 3 14.12.2010 17:48
При второй синхронизации программа зависает bulldog5293 Работа с сетью в Delphi 0 27.11.2010 14:42
Проблема синхронизации. beda Microsoft Office Word 3 30.06.2010 13:37
Теряются данные при синхронизации реплик - чего делать? batasha Microsoft Office Access 0 14.05.2009 14:34
Реализация функций синхронизации потоков. натка Помощь студентам 1 03.01.2008 15:26