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

fedotxxl

Well-known member
09.11.2005
614
0
#1
Как при помощи LS проверять существование папок (физических), удалять папки (с файлами внутри) ?
 
O

oshmianski

#2
Как при помощи LS проверять существование папок (физических), удалять папки (с файлами внутри) ?
Shell + dos команды
Это для удаления.
Для проверки \ создания - mkDir. Только на сколько я помню, в пятерке была трабла с количеством вложенных папок. Типа MkDir "d:\f1\f2\f3" не давал создать, если этого пути не было, только d:\f1.
 
O

oshmianski

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

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

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

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

fedotxxl

Well-known member
09.11.2005
614
0
#5
Ясно.... и последний вопрос - функции mkdir и rvdir выдают ошибки, когда директория уже создана / не существует. Как проверить существование директориии?
 
O

oshmianski

#6
Ясно.... и последний вопрос - функции mkdir и rvdir выдают ошибки, когда директория уже создана / не существует. Как проверить существование директориии?
Function makeDir (pathName As String)

On Error 75 Goto ERRmkDir

Mkdir (pathName)

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

End Function
 

fedotxxl

Well-known member
09.11.2005
614
0
#7
А нельзя ли на прямую выполнить команду del? Не через бат-файл?
 
O

oshmianski

#8
А нельзя ли на прямую выполнить команду del? Не через бат-файл?
На сколько я понял из хелпа - нет, нельзя. Лотус ищет программу.
Это я про Shell, а если в общем случае, то думаю, что должны быть апишные функции, хотя могу и ошибаться.
 
E

Elena Nefedova

#9
Вот код. Написан года четыре тому. Но пока что работает - не переделывала.
Принимает имя или массив имен файлов или каталогов
Код:
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
 

fedotxxl

Well-known member
09.11.2005
614
0
#10
O

oshmianski

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

fedotxxl

Well-known member
09.11.2005
614
0
#13
Действительно, скрипт Елены Нефедовой прекрасно работает. Тему можно закрывать