purebasic.info

PureBasic forum
Текущее время: Вт окт 23, 2018 11:45 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 39 ]  На страницу Пред.  1, 2, 3
Автор Сообщение
 Заголовок сообщения: Re: Удаление в Корзину
СообщениеДобавлено: Ср окт 09, 2013 7:38 pm 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 70 раз.
Поблагодарили: 81 раз.
Пункты репутации: 24
А так (можно выбрать, отображать ли прогрессбар)
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
Procedure DeleteToBin(FileName$, Confirm, ProgressBar = 1)
  Protected len, *mem, ok
  len = Len(FileName$)
  *mem = AllocateMemory(len + 2)
  If *mem
    Select FileSize(FileName$)
      Case -2 ;Если это папка
        PokeS(*mem,FileName$)
        PokeB(*mem+len+1,0)
        PokeB(*mem+len+2,0)
      Case -1 ;Файла и папки нет
        FreeMemory(*mem)
        ProcedureReturn #False
      Default ;Если это файл
        PokeS(*mem,FileName$)
    EndSelect
  Else
    ProcedureReturn #False
  EndIf
  SHFileOp.SHFILEOPSTRUCT
  SHFileOp\pFrom=*mem
  SHFileOp\wFunc=#FO_DELETE
  SHFileOp\fFlags=#FOF_ALLOWUNDO
  If Confirm = 0
    SHFileOp\fFlags = SHFileOp\fFlags|#FOF_NOCONFIRMATION
  EndIf
 
  If ProgressBar = 0
    SHFileOp\fFlags = SHFileOp\fFlags | #FOF_SILENT
  EndIf
 
  ok = SHFileOperation_(SHFileOp)
  FreeMemory(*mem)
  If ok = 0
    ProcedureReturn #True
  Else
    ProcedureReturn #False
  EndIf
EndProcedure


_________________
Пурик - лучший язык программирования


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Удаление в Корзину
СообщениеДобавлено: Ср окт 09, 2013 7:44 pm 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Ср окт 09, 2013 5:00 pm
Сообщений: 51
Благодарил (а): 2 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
В общем, вот как-то так, но с подтверждением запроса нужно еще разобраться.
Весь код - всего лишь обертка над API функцией.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Procedure DeleteToBin(FileName$,Confirm)
  Protected *mem
  Define.i flen,fsize,result
  result=0
  flen = Len(FileName$)
  fsize=FileSize(FileName$)
  If fsize=-1
    SetLastError_(#ERROR_FILE_NOT_FOUND)
    ProcedureReturn #False
  EndIf
 
  *mem = AllocateMemory(flen + 2)
 
  If Not *mem
    SetLastError_(#ERROR_NOT_ENOUGH_MEMORY)
    ProcedureReturn #False
  EndIf
 
  PokeS(*mem,FileName$+Chr(0)+Chr(0))
 
  SHFileOp.SHFILEOPSTRUCT
  SHFileOp\pFrom=*mem
  SHFileOp\wFunc=#FO_DELETE
  SHFileOp\fFlags=#FOF_ALLOWUNDO|#FOF_SILENT
  If Confirm = 0
    SHFileOp\fFlags = SHFileOp\fFlags|#FOF_NOCONFIRMATION
  EndIf
 
  result= SHFileOperation_(SHFileOp)
  FreeMemory(*mem)
  If result = 0
    SetLastError_(#ERROR_SUCCESS)
    ProcedureReturn #True
  Else
    ProcedureReturn #False
  EndIf
EndProcedure



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Удаление в Корзину
СообщениеДобавлено: Чт окт 10, 2013 8:14 am 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
Уже три года лежит
Удалить файл в корзину

_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Удаление в Корзину
СообщениеДобавлено: Чт окт 10, 2013 4:03 pm 
Не в сети
доцент
Аватар пользователя

Зарегистрирован: Ср окт 09, 2013 5:00 pm
Сообщений: 51
Благодарил (а): 2 раз.
Поблагодарили: 1 раз.
Пункты репутации: 0
И к чему это сообщение? Мы уже разобрались :lol:
Кстати, код, ссылку на который Вы нам предоставили, неправилен.

Пправильнее было бы перенести эту темку в win api, имхо. :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Удаление в Корзину
СообщениеДобавлено: Вт июл 22, 2014 7:38 pm 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 70 раз.
Поблагодарили: 81 раз.
Пункты репутации: 24
Понадобилось удалять файлы в корзину, отмеченные чекбоксами в ListIconGadget. В цикле есть такой код:
Код:
1
2
3
4
5
6
7
Case #DeleteToBin
  For i = 0 To CountGadgetItems(#ListOfFiles)-1
    If GetGadgetItemState(#ListOfFiles, i) & #PB_ListIcon_Checked
      DeleteToBin(GetGadgetItemText(#ListOfFiles, i, 1) + GetGadgetItemText(#ListOfFiles, i, 0), 0)
      ;RemoveGadgetItem(#ListOfFiles, i)
    EndIf
  Next

Процедуры я брал самые разные - и из этой темы, и из темы в WinAPI (pablov дал ссылку несколько постов выше). Если выделить несколько файлов, то программа удалит только один, а потом вылетает с ошибкой "Невозможен доступ к памяти". Взял процедуру последнюю из этой темы: viewtopic.php?f=8&t=3015&p=76434#p70753
Ошибка возникает в строке
Код:
1
FreeMemory(*mem)

Что делать? Win8. Программа собрана в Unicode и ThreadSafe, с поддержкой OnError. Пробовал компилировать обычным способом и от имени админа - нифига :cry: :cry:

_________________
Пурик - лучший язык программирования


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Удаление в Корзину
СообщениеДобавлено: Вт июл 22, 2014 7:44 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11304
Благодарил (а): 4 раз.
Поблагодарили: 438 раз.
Включи Purefier и смотри где будет ошибка.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Удаление в Корзину
СообщениеДобавлено: Вт июл 22, 2014 7:45 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 25, 2009 1:02 pm
Сообщений: 2286
Откуда: Russia — Belarus
Благодарил (а): 6 раз.
Поблагодарили: 72 раз.
Пункты репутации: 11
Код:
1
*mem = AllocateMemory(flen + 2)


Здесь +2 мало.
Прибавь к примеру +1024 для теста — должно работать (удаление нескольких файлов подряд).

И кстати, походу это из-за юникода. Т.е. надо прибавлять не +2 байта, а +2 char'актера, возможно.

_________________
EnableExplicit User


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Удаление в Корзину
СообщениеДобавлено: Вт июл 22, 2014 7:51 pm 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 70 раз.
Поблагодарили: 81 раз.
Пункты репутации: 24
Иногда бывает ошибка в строке
Код:
1
*mem = AllocateMemory(flen + 2)

Они чередуются

Цитата:
Здесь +2 мало. Прибавь к примеру +1024 для теста — должно работать (удаление нескольких файлов подряд).
Ну я же не сразу все файлы пихаю, а процедуру несколько раз вызываю, в каждом вызове по одному файлу.

Цитата:
Т.е. надо прибавлять не +2 байта, а +2 char'актера, возможно
Не помогло

_________________
Пурик - лучший язык программирования


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Удаление в Корзину
СообщениеДобавлено: Вт июл 22, 2014 8:04 pm 
Не в сети
PureBasic Coder
Аватар пользователя

Зарегистрирован: Чт ноя 10, 2011 10:50 am
Сообщений: 4049
Откуда: Ростов-на-Дону
Благодарил (а): 70 раз.
Поблагодарили: 81 раз.
Пункты репутации: 24
Включил Purifier. Ошибка в строке:
Код:
1
PokeS(*mem,FileName$+Chr(0)+Chr(0))

Цитата:
Overflow in dynamically allocated memory block.
По моим знаниям английского: Переполнение в динамически выделенном блоке памяти. Долго думаю, и до меня доходит, что это юникод, а в имени файла есть русские буквы!!! Т.е. надо не
Код:
1
flen = Len(FileName$)

а
Код:
1
flen = StringByteLength(FileName$)

Перезапускаю, ошибки нет, но файлы и не удаляются. Запускаю от имени админа и всё ОК! Всем откликнувшимся спасибо!!

_________________
Пурик - лучший язык программирования


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 39 ]  На страницу Пред.  1, 2, 3

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB