Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > Папки


Автор: alt5000 31.1.2007, 10:46
Предлагаю подумать над, по моему , неразрешимой проблемой. Я, во всяком случае не могу вообще понять.... Есть форма, на которой 2 элемента: текстовое поле и кнопка.
Кнопка содержит следующий код:

Код

Private Sub Command1_Click()

If Dir(Text1 + "\*.*") <> "" Then 'Проверяет, есть ли не пустая папка и если она есть, удаляет
Kill (Text1 + "\*.*") 'Удаляет файлы  в папке
RmDir (Text1) 'Удаляет саму папку
Else 'Если такой папки нет, то создает
MkDir (Text1) 'Создает директорию
Open Text1 + "\1.tst" For Random As 1 'Создает в этой дир файл (чтобы не была пустой)
Close 1
End If

End Sub


Вся проблема в том, что программа выдает ошибку на строке RmDir. Пожалуйста, создайте модель в редакторе и посмотрите, в чем может быть загвоздка. Буду благодарен за помощь

Автор: Naghual 31.1.2007, 14:03
Если все написано правильно, папка не используется другими процессами и права пользователя позволяют ему удалить папку, значит папка не пуста. 

Автор: alt5000 31.1.2007, 14:17
В том - то все и дело, что оператор RmDir следует прямо за оператором kill, который убивает все файлы в этой папке. а он - то как раз выполняется успешно, следовательно, после него, в папке ничего не остается. Алгоритм - то прос: Если есть папка - удалить, если нет - создать Неужели не один я не могу с этим справиться?  smile 

Автор: Naghual 31.1.2007, 14:47
А Kill может и не отработаться...

Автор: alt5000 31.1.2007, 15:52
Я просматривал содержимое папки при пошаговом прохождении программы после kill. Результат - папка пуста!

Автор: JusTalionis 31.1.2007, 15:57
А не создается ли в той папке, автоматически, какой-нибудь скрытый файл, вроде desktop.ini ?

сделай паузу после kill, влезь во время этой паузы в папку при помощи другого процесса, например в ВинКоммандере, и проверь, пустая ли она в действительности, или нет?

А какую именно ошибку показывает RMDIR?


Автор: Naghual 31.1.2007, 16:00
А вручную удалить можеш ее?

Автор: alt5000 31.1.2007, 16:29
Цитата(Naghual @ 31.1.2007,  16:00)
А вручную удалить можеш ее?

Да, что я и делаю, после того как возникла ошибка, так как она возникает после kill, то dir не отрабатывается и для чистоты эксперимента я удаляю папку и запускаю программу снова

Добавлено @ 16:32 
Цитата(JusTalionis @ 31.1.2007,  15:57)
А не создается ли в той папке, автоматически, какой-нибудь скрытый файл, вроде desktop.ini ?

А какую именно ошибку показывает RMDIR?

RmDir вызывает ошибку 75 Path/file access ... Попробуйте в редакторе создать тогда может что-нить станет яснее, но согласитесь, ситуация парадоксальная. Алгоритм - то прост до безумия: Если есть папка - удалить. если нет - создать. Может обратиться в центр техподдержки?  smile 

Автор: bom 31.1.2007, 17:13
Помнится я уже давал http://forum.vingrad.ru/topic-132262/hl/index.html для подобной задачи с использованием FSO.

Если все же хочется удалять папку и вложенные (только файлы) используя RmDir, держи этот:
Код

Private Sub Command1_Click()
On Error GoTo errproc
If GetAttr(Text1) And vbDirectory Then
If Dir(Text1 + "\*.*") <> "" Then Kill (Text1 + "\*.*")
RmDir (Text1)
End If
Exit Sub
errproc:
If Err.Number = 53 Then
MkDir (Text1)
Open Text1 + "\1.tst" For Random As 1
Close 1
ElseIf Err.Number = 75 Then
Dir
Resume
Else
MsgBox Err.Description, vbCritical
End If
End Sub

Автор: JusTalionis 31.1.2007, 17:25
Цитата(alt5000 @  31.1.2007,  16:29 Найти цитируемый пост)
Может обратиться в центр техподдержки? 
А где есть центр такого профиля?
Кста, по моему личному опыту общения с различными техподдержками, думаю этот вопрос для них слишком сложен smile

75 - access denied? - это значит, объект находится в использовании программой, поэтому не может быть удален.

Цитата(alt5000 @  31.1.2007,  16:29 Найти цитируемый пост)
что я и делаю, после того как возникла ошибка
после того, как она возникла, прога уже закрылась и освободила папку, поэтому ты и можешь ее удалить вручную. Ты попробуй во время паузы, пока ошибка еще не появилась.
И проверь, нет ли там скрытого файла (лучше коммандером - Винда может не показать), скрытые kill не удаляет.



Автор: alt5000 1.2.2007, 09:30
Цитата(JusTalionis @ 31.1.2007,  17:25)

75 - access denied? - это значит, объект находится в использовании программой, поэтому не может быть удален.


Access error!

Добавлено @ 09:38 
Цитата(bom @ 31.1.2007,  17:13)
Помнится я уже давал полный код для подобной задачи с использованием FSO.


Огромное спасибо за код , он отлично работает  smile  (кто-бы сомневался, да?)  smile  Но я не могу никак понять, почему не работает первонгачальный вариант. Может сможешь объяснить? Код-то простой...

Автор: JusTalionis 1.2.2007, 14:46
alt5000
Проверил твой код. Под Win98 всё пашет; первое нажатие создает папку, второе ее удаляет. Но под XP получается тот самый глюк с ошибкой 75.
Что бы это могло быть? Предположительно - XP пытается выполнить rmdir раньше, чем закончится kill. Для проверки вставляем паузу с контролем удаления между kill и rmdir.
Получился следующий код:
Код

Private Sub Command1_Click()

If Dir (Text1 + "\*.*") <> "" Then      'Проверяет, есть ли не пустая папка и если она есть, удаляет
  Kill (Text1 + "\*.*")                 'Удаляет файлы  в папке
  While Dir(Text1 + "\*.*") <> ""       'ожидание удаления
  Wend
  RmDir (Text1)                         'Удаляет саму папку
Else                                    'Если такой папки нет, то создает
  MkDir (Text1)                         'Создает директорию
  Open Text1 + "\1.tst" For Random As 1 'Создает в этой дир файл (чтобы не была пустой)
  Close 1
  End If
  
End Sub

 - фокус-покус! smile 

Автор: bom 1.2.2007, 19:49
Цитата(alt5000 @  1.2.2007,  09:30 Найти цитируемый пост)
почему не работает ... сможешь объяснить?

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

Автор: JusTalionis 2.2.2007, 12:41
bom
Нет, просто XP выполняет kill и rmdir как внешние процессы, то есть они выполняются параллельно, и kill не успевает удалить содержимое, вот и всё...
Я вставил паузу (см выше) и всё заработало...

ЗЫ по крайней мере, у меня ))

Автор: bom 2.2.2007, 19:27
Цитата(JusTalionis @  2.2.2007,  12:41 Найти цитируемый пост)
Я вставил паузу (см выше) и всё заработало...

Действительно, работает...
Похоже я не прав оказался.
Так же дело и не в паузе: какую бы паузу (Sleep) не поставить вместо твоего цикла, access denied все равно остается  smile 
Так же выяснил, что твой цикл не выполняется не разу (с помощью счетчика).
Цитата(JusTalionis @  2.2.2007,  12:41 Найти цитируемый пост)
XP выполняет kill и rmdir как внешние процессы, то есть они выполняются параллельно

Позволю себе не согласиться. Эти функции VB в работающей программе выполняются последовательно.

Автор: alt5000 5.2.2007, 10:09
Цитата(JusTalionis @ 1.2.2007,  14:46)
alt5000
Проверил твой код. Под Win98 всё пашет; первое нажатие создает папку, второе ее удаляет. Но под XP получается тот самый глюк с ошибкой 75.
Что бы это могло быть? Предположительно - XP пытается выполнить rmdir раньше, чем закончится kill. Для проверки вставляем паузу с контролем удаления между kill и rmdir.

Ты - гений! Правда я не знаю, что такое Wend, но программа работает и структура изначального алгоритма полностью сохранена.

Автор: Кирилл 5.2.2007, 18:41
Цитата(alt5000 @  5.2.2007,  10:09 Найти цитируемый пост)
Правда я не знаю, что такое Wend

alt5000, такие пробелы нужно убирать smile 
Цикл типа While ... Wend то же самое что и Do while ... loop, только старее. В принципе он уже не нужен, но для совместимости его оставили.
P.S. Само слово Wend расшифровывается как While end.

Автор: JusTalionis 6.2.2007, 18:04
Цитата(alt5000 @  5.2.2007,  10:09 Найти цитируемый пост)
я не знаю, что такое Wend
 в дополнение к сказанному Кириллом:
Исходя из моего предположения о выполнении rmdir, я вставил между ними пустой цикл с проверкой удаленности файлов - постоянно проверять, пока реально не окажется, что уже ни одного файла нету, и на этом кончается цикл и запускается rmdir.


Цитата(JusTalionis @  1.2.2007,  14:46 Найти цитируемый пост)
Это сообщение отредактировал(а) cardinal - 2.2.2007, 01:37 
cardinal, а что, не разноцветный код на форуме воспрещен? smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)