Модераторы: Akina

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Папки, Сага о папках продолжается 
:(
    Опции темы
alt5000
  Дата 31.1.2007, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 9.4.2006
Где: г. Выборг

Репутация: нет
Всего: нет



Предлагаю подумать над, по моему , неразрешимой проблемой. Я, во всяком случае не могу вообще понять.... Есть форма, на которой 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. Пожалуйста, создайте модель в редакторе и посмотрите, в чем может быть загвоздка. Буду благодарен за помощь

Это сообщение отредактировал(а) alt5000 - 31.1.2007, 11:56
PM MAIL WWW   Вверх
Naghual
Дата 31.1.2007, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1893
Регистрация: 15.5.2004
Где: Украина, Днепр

Репутация: 26
Всего: 49



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


--------------------
Я желаю всем Счастья!
PM ICQ Skype   Вверх
alt5000
Дата 31.1.2007, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 9.4.2006
Где: г. Выборг

Репутация: нет
Всего: нет



В том - то все и дело, что оператор RmDir следует прямо за оператором kill, который убивает все файлы в этой папке. а он - то как раз выполняется успешно, следовательно, после него, в папке ничего не остается. Алгоритм - то прос: Если есть папка - удалить, если нет - создать Неужели не один я не могу с этим справиться?  smile 
PM MAIL WWW   Вверх
Naghual
Дата 31.1.2007, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1893
Регистрация: 15.5.2004
Где: Украина, Днепр

Репутация: 26
Всего: 49



А Kill может и не отработаться...


--------------------
Я желаю всем Счастья!
PM ICQ Skype   Вверх
alt5000
Дата 31.1.2007, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 9.4.2006
Где: г. Выборг

Репутация: нет
Всего: нет



Я просматривал содержимое папки при пошаговом прохождении программы после kill. Результат - папка пуста!
PM MAIL WWW   Вверх
JusTalionis
Дата 31.1.2007, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 576
Регистрация: 11.7.2006

Репутация: 6
Всего: 17



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

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

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


PM MAIL   Вверх
Naghual
Дата 31.1.2007, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1893
Регистрация: 15.5.2004
Где: Украина, Днепр

Репутация: 26
Всего: 49



А вручную удалить можеш ее?


--------------------
Я желаю всем Счастья!
PM ICQ Skype   Вверх
alt5000
  Дата 31.1.2007, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 9.4.2006
Где: г. Выборг

Репутация: нет
Всего: нет



Цитата(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 
PM MAIL WWW   Вверх
bom
Дата 31.1.2007, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 329
Регистрация: 22.2.2004
Где: Казахстан, Алматы

Репутация: 4
Всего: 6



Помнится я уже давал полный код для подобной задачи с использованием 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


Это сообщение отредактировал(а) bom - 31.1.2007, 21:14
PM MAIL   Вверх
JusTalionis
Дата 31.1.2007, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 576
Регистрация: 11.7.2006

Репутация: 6
Всего: 17



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

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

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



PM MAIL   Вверх
alt5000
  Дата 1.2.2007, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 9.4.2006
Где: г. Выборг

Репутация: нет
Всего: нет



Цитата(JusTalionis @ 31.1.2007,  17:25)

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


Access error!

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


Огромное спасибо за код , он отлично работает  smile  (кто-бы сомневался, да?)  smile  Но я не могу никак понять, почему не работает первонгачальный вариант. Может сможешь объяснить? Код-то простой...
PM MAIL WWW   Вверх
JusTalionis
Дата 1.2.2007, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 576
Регистрация: 11.7.2006

Репутация: 6
Всего: 17



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 

Это сообщение отредактировал(а) cardinal - 2.2.2007, 01:37
PM MAIL   Вверх
bom
Дата 1.2.2007, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 329
Регистрация: 22.2.2004
Где: Казахстан, Алматы

Репутация: 4
Всего: 6



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

Предпочитаю не углубляться в дебри теории, если существует более лучший и работающий способ. Применительно к данному случаю - вероятно обращение к папке (функцией Dir) блокирует эту папку. 
PM MAIL   Вверх
JusTalionis
Дата 2.2.2007, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 576
Регистрация: 11.7.2006

Репутация: 6
Всего: 17



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

ЗЫ по крайней мере, у меня ))
PM MAIL   Вверх
bom
Дата 2.2.2007, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 329
Регистрация: 22.2.2004
Где: Казахстан, Алматы

Репутация: 4
Всего: 6



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

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

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

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "VB6"
Akina

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по VB обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB6 | Следующая тема »


 




[ Время генерации скрипта: 0.0745 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.