Как при помощи Ls проверять существование папок (физических), удалять

Тема в разделе "Lotus - Программирование", создана пользователем fedotxxl, 20 июн 2006.

  1. fedotxxl

    fedotxxl Well-Known Member

    Регистрация:
    9 ноя 2005
    Сообщения:
    614
    Симпатии:
    0
    Как при помощи LS проверять существование папок (физических), удалять папки (с файлами внутри) ?
     
  2. oshmianski

    oshmianski Гость

    Shell + dos команды
    Это для удаления.
    Для проверки \ создания - mkDir. Только на сколько я помню, в пятерке была трабла с количеством вложенных папок. Типа MkDir "d:\f1\f2\f3" не давал создать, если этого пути не было, только d:\f1.
     
  3. fedotxxl

    fedotxxl Well-Known Member

    Регистрация:
    9 ноя 2005
    Сообщения:
    614
    Симпатии:
    0
    Другой вопрос - как исполнять shell команды на LS?
     
  4. oshmianski

    oshmianski Гость

    Возможно изврат, но...
    Можно написать .bat файлик, которые выполняет некоторые действия (удаляет файлы, создает директории и т.д.), ложим к себе в рабочую директорию, ну скажем c:\program fiels\lotus\notes\del.bat.
    В этом файле пишем:
    del /q %1

    А в LS пишем так:

    Dim n As Variant
    n = Shell({del.bat d:\temp\1\*.*}, 1)

    Вот и все. Это конечно редкий изврат, но...
     
  5. fedotxxl

    fedotxxl Well-Known Member

    Регистрация:
    9 ноя 2005
    Сообщения:
    614
    Симпатии:
    0
    Ясно.... и последний вопрос - функции mkdir и rvdir выдают ошибки, когда директория уже создана / не существует. Как проверить существование директориии?
     
  6. oshmianski

    oshmianski Гость

    Function makeDir (pathName As String)

    On Error 75 Goto ERRmkDir

    Mkdir (pathName)

    Exit Function
    ERRmkDir:
    'Print "Директория уже существует"
    Resume Next

    End Function
     
  7. fedotxxl

    fedotxxl Well-Known Member

    Регистрация:
    9 ноя 2005
    Сообщения:
    614
    Симпатии:
    0
    А нельзя ли на прямую выполнить команду del? Не через бат-файл?
     
  8. oshmianski

    oshmianski Гость

    На сколько я понял из хелпа - нет, нельзя. Лотус ищет программу.
    Это я про Shell, а если в общем случае, то думаю, что должны быть апишные функции, хотя могу и ошибаться.
     
  9. Elena Nefedova

    Elena Nefedova Гость

    Вот код. Написан года четыре тому. Но пока что работает - не переделывала.
    Принимает имя или массив имен файлов или каталогов
    Код (Text):
    Sub Del_Files(File As Variant)
    ' Created by Elena Nefedova, Fors - Banking Systems
    On Error Goto ErrLab
    Dim arFile() As String, arTreated() As String, err_text$
    Redim arTreated(0)
    If Not Isarray(File) Then
    If Trim(File) = "" Then
    Goto EndLab
    Else
    Redim arFile(0)
    arFile(0) = File
    End If
    Else
    Dim tmpFile As Variant, tmpI%
    tmpFile = Fulltrim(Arrayunique(File))
    If tmpFile(0) = "" Then
    Goto EndLab
    Else
    Redim arFile(Ubound(tmpFile))
    For tmpI = Ubound(tmpFile) To 0 Step -1
    arFile(tmpI) = tmpFile(tmpI)
    Next tmpI
    End If
    End If  
    'Теперь имеем массив arFile непустых строк - имен файлов или папок
    Dim u%
    u = Ubound(arFile)
    Do While (u >= 0)
    Dim attr_info%, cur_file$
    cur_file = arFile(u)
    u = u - 1
    If u < 0 Then
    Redim arFile (0)
    Else
    Redim Preserve arFile (u)
    End If
    On Error 53 Goto Err53Lab
    attr_info = Getfileattr(cur_file)
    On Error Goto ErrLab
    If (attr_info And 16) Then                   'обработка папки
    Dim direlem$, bDir As Boolean
    bDir = False
    direlem = Dir$(cur_file + "\*", 30)
    Do While direlem <> ""
    If Left(direlem, 1) <> "." Then
    'если каталог не пуст, то добавим его для дальнейшей обработки
    If Not bDir Then        'добавку производим 1 раз, пока не выставлен флаг bDir
    If Arraygetindex(arTreated, cur_file, 1) Then
    err_text = "Невозможно обработать элемент " + cur_file
    Print err_text
    Goto EndLab
    Else
    u = u + 1
    Redim Preserve arFile(u)
    arFile(u) = cur_file
    End If
    bDir = True                          'флаг "каталог не пуст"
    End If
    u = u + 1
    Redim Preserve arFile(u)
    arFile(u) = cur_file + "\" + direlem
    End If
    direlem = Dir$
    Loop
    If Not bDir Then                         'Если каталог пуст, то удалим его
    On Error Resume Next            'А из массива обработки мы его исключили еще в самом начале
    Rmdir cur_file                     
    On Error Goto ErrLab
    Redim Preserve arTreated(Ubound(arTreated)+1)
    arTreated(Ubound(arTreated)) = cur_file 'пополним список обработанных файлов
    End If
    Else                                              'обработка файла
    Kill cur_file
    Redim Preserve arTreated(Ubound(arTreated)+1)
    arTreated(Ubound(arTreated)) = cur_file 'пополним список обработанных файлов
    End If
    Loop_u_lab:
    Loop
    EndLab:
    'КОНЕЦ ПОДПРОГРАММЫ
    Exit Sub
    ErrLab:
    Msgbox "File_Dir_lib : Del_Files" + Chr(13) _
    + "Sub Del_Files" + Chr(13) _
    +"Line : " + Str$(Erl) + Chr(13)+ "Error " + Str$(Err) + Chr(13) + Error$
    Goto EndLab
    Err53Lab:
    On Error Goto ErrLab
    Redim Preserve arTreated(Ubound(arTreated)+1)
    arTreated(Ubound(arTreated)) = cur_file 'пополним список обработанных файлов
    Goto Loop_u_lab
    End Sub
     
  10. fedotxxl

    fedotxxl Well-Known Member

    Регистрация:
    9 ноя 2005
    Сообщения:
    614
    Симпатии:
    0
    Итак, что вышло у меня

    Создание папки
    Удаление папки
    Удаление файлов из папки
     
  11. Elena Nefedova

    Elena Nefedova Гость

    А если каталог не пустой?
     
  12. oshmianski

    oshmianski Гость

    Первый раз пройдет. А второй - нет. Вы ж удаляете и сам батник.
    На Вашем месте я бы использовал скрипт Елены.
    Далее про Shell. Если скрипт будет выполняться на одной машине, то пол-беды, иначе придется плодить батники. Ну в том случае, если на серваке, то ладно. Потом права. Если нет прав на файловом уровне - удаление не пройдет (это в лучшем случае).
    Далее... "Mkdir(folder)". Я ж дал функцию, которая существование дирректории учитывает.
    И вообще - общую задачу в студию. Будет проще и Вам и нам.
     
  13. fedotxxl

    fedotxxl Well-Known Member

    Регистрация:
    9 ноя 2005
    Сообщения:
    614
    Симпатии:
    0
    Действительно, скрипт Елены Нефедовой прекрасно работает. Тему можно закрывать
     
Загрузка...

Поделиться этой страницей