Страница 1 из 1

Воспроизведение в структуре каталогов недостающих файлов

Добавлено: Ср май 09, 2012 00:19
shveicar
Здравствуйте.
Созданная тема, является логическим продолжением данной
темы в виду изменения в ней поставленной задачи, и в связи с отсутствием окончательного решения.
На данный момент, пытаюсь решить такую проблему:
Есть определенная структура каталогов, с разными именами, и разными уровнями вложенности.
Во многих каталогах, присутствуют различные типы файлов (графика, мультимедиа, и другие, в том числе могут находится и файлы с расширениями htm,html).
Моя задача, поместить в определенные каталоги,(отсчёт глубины может задаваться в окне, и производится от корня диска 0,1,2,3 и т.д) - определенное количество html файлов, (количество файлов также, может быть заданно в окне при помещении) ясно, что в каждый из каталогов, находящихся на одном уровне, - попадет одинаковое количество файлов.
В случае совпадения, с именем уже существующих в каталоге html файлов, должно произойти автоматическое переименование по счетчику, пример: - имя_файла(1).html.
Сами html файлы в итоге,- должны иметь имена тех же каталогов,- в которые они помещаются, и создаваться из одного (исходного шаблона) html.
В принципе можно использовать групповое переименование после их помещения, но если есть единое, комплексное, - решение это будет удобнее.
В дальнейшем, будет выполнено редактирование созданных файлов для их взаимосвязи с другими файлами.(но это уже отдельно)
Как лучше это осуществить. Спасибо.

Добавлено: Ср май 09, 2012 01:11
Flasher
shveicar писал(а):ясно, что в каждый из каталогов, находящихся на одном уровне, - попадет одинаковое количество файлов.
А на другом, получается, другое количество?
И как это кол-во определять? Как именовать копии?

Добавлено: Ср май 09, 2012 01:27
shveicar
Flasher Спасибо за отклик, доброй ночи.
Flasher писал(а):А на другом, получается, другое количество?
А как могут на другом уровне возникнуть файлы, если речь идет о изначально заданной глубине вложенности? Только если повторно использовать скрипт, с другими параметрами..
Например: выделяем каталог с многоуровневой структурой. (файл шаблона находится в той же папке что и скрипт). В начале, появляется окно с уровнем глубины, а затем окно с количеством создаваемых файлов.
При такой схеме, будет удобно использовать для разных уровней - своих, индивидуальных шаблонов, что в дальнейшем позволит упростить их последующую схему редактирования.
Как именовать копии?
Изначально имя шаблона - например: shablon.html (это удобно, поскольку совпадения такого имени -маловероятны) - имеется ввиду возможный сценарий, с последующим групповым переименованием..
В этом случае, при создании копий будут последовательно добавляться цифры, например: shablon1.html, shablon2.html и тд. Если вдруг, все таки - в каталоге будет находиться файл с таким именем, - то к оригинальному имени будет добавляться еще одна цифра в скобках, например: shablon1(1).html
Если групповое переименование, можно задействовать сразу, при копировании, тогда схема та же, только в начале имени html файла -добавиться имя каталога, в который файлы перемещаются, например: folder1_shablon1.html это еще удобнее, поскольку такие файлы сразу будут выделятся, и их имена, в дальнейшем, можно всегда изменить.

Добавлено: Ср май 09, 2012 19:20
Flasher
Пробуем:

Код: Выделить всё

'=============================================================================
' Создание копий файла на указанной глубине вложенности в выделенных папках
' Приставка к имени копии файла = имени родительской папки

' Параметры: %L "<путь к файлу-шаблону>"
'=============================================================================
With WScript.Arguments
  C = .Count : If .Count = 0 Then WScript.Quit
  If C < 2 Then MsgBox "Укажите оба параметра!", 48
  List = .Item(0) : Templ = .Item(1)
End With : Const M = 1

Msg Count, " копий файла:"
Msg Depth, ", определяющее глубину вложенности от корня диска:"
Sub Msg(Sum, Word)
  L = vbNewline : Sum = ""
  Do Until IsNumeric(Sum) 
    Sum = InputBox(L&L&L&L&L& "Введите число" & Word,_
    "Создание копий на нужной глубине", 3) 
    If Trim(Sum) = "" Then WScript.Quit 
  Loop 
End Sub

Set FSO = CreateObject("Scripting.FileSystemObject")
Name = FSO.GetFileName(Templ) : BName = FSO.GetBaseName(Templ)
Ext  = FSO.GetExtensionName(Name)
With FSO.OpenTextFile(List, 1)
  Do While Not .AtEndOfStream
    F = Trim(.ReadLine)
    If F <> "" Then
      If FSO.FolderExists(F) Then ForFolders F, Depth, Count, Name, BName, Ext, Templ
    End If
  Loop : .Close
End With : Set FSO = Nothing : WScript.Quit

Sub ForFolders(Fold, D, Cnt, FName, BN, E, Tml)
  Set SubF = FSO.GetFolder(Fold).SubFolders
  If SubF.Count > 0 Then  
    For Each Folder in SubF
      Max = UBound(Split(Folder, "\")) + 1
      If Max = Abs(D) Then
        FoldName = FSO.GetFileName(Folder) : BN1 = FoldName & "_" & BN
        For i = 1 to Cnt
          N1 = FoldName & "_" & FName : l = 0
          Do While FSO.FileExists(Folder & "\" & N1)
            l = l + 1
            If l < 10^M Then PostFix = Right(String(M, "0") & l, M) Else PostFix = l
            N1 = BN1 & " (" & PostFix & ")." & E
          Loop
          FSO.CopyFile Tml, Folder & "\" & N1
        Next
      ElseIf Max < Abs(D) Then ForFolders Folder, D, Cnt, FName, BN, E, Tml
      End If
    Next
  End If
End Sub

Добавлено: Ср май 09, 2012 21:33
shveicar
Flasher
Просто "Волшебство" Что еще можно добавить...
Разве, только, - Большое Спасибо, за проделанную работу. :)