Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> SHFileOperation ошибка "2", что это значит? 
V
    Опции темы
Fealeron
Дата 24.8.2010, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Пишу программу на С++ с использованием Qt, необходимо удалять файлы в корзину под windows.
Использую для этого SHFileOperation, код приведен ниже.
Часть файлов удаляется нормально, вторая часть отказывается удалятся возвращая код "2".
Сижу в windows 7 (может быть это играет роль...).

В msdn смотрел, не не нашел там такой ошибки в описании SHFileOperation, поиск в google выдаёт много мусора.

Что значит код ошибки 2 у SHFileOperation?
Может быть ошибка в написанном мною коде, если так, то покажите где.

Заранее спасибо.
Код

#include <windows.h>
#include <shellapi.h>

...

        QString file_for_delete = str;
        file_for_delete += "\0\0";

        SetFileAttributes((wchar_t*)(file_for_delete.utf16()),FILE_ATTRIBUTE_ARCHIVE);

        SHFILEOPSTRUCT shfo={0};
        shfo.wFunc=FO_DELETE;
        shfo.pFrom = (wchar_t*)(file_for_delete.utf16());
        shfo.fFlags =FOF_NOCONFIRMATION | FOF_SIMPLEPROGRESS | FOF_NOERRORUI | FOF_ALLOWUNDO;
        shfo.fAnyOperationsAborted=false;
        shfo.hNameMappings=NULL;
        shfo.pTo = NULL;
        shfo.lpszProgressTitle=NULL;
        int res = SHFileOperation (&shfo);
        qDebug() << "Code: " << hex << res << "File: " << file_for_delete;
        return res;

Код

Code:  2 File:  "D:/Медиа/Аудио/Обезьянки, Вперед!_-_В каждом маленьком ребенке.mp3" 
Code:  2 File:  "D:/Медиа/Аудио/Новая папка/splin_-_vsego_horoshego.mp3" 
Code:  2 File:  "D:/Медиа/Аудио/Новая папка/yak_romantichno_pahn.mp3" 
Code:  2 File:  "D:/Медиа/Аудио/Новая папка/bob_marley_-_don_t_worry,_be_happy.mp3"
Code:  2 File:  "D:/Медиа/Аудио/Новая папка/znp17ebay.mp3" 
Code:  0 File:  "D:/Медиа/Аудио/Новая папка/ME06M.rar"                              <-- файл переместился в корзину, как и надо.
Code:  2 File:  "D:/Медиа/Аудио/Тишина.mp3" 
Code:  2 File:  "D:/Медиа/Аудио/Новая папка/Rezume11.doc" 
Code:  2 File:  "D:/Медиа/Аудио/Новая папка/1260202645_riddles_of_brain.gif" 
Code:  2 File:  "D:/Медиа/Аудио/Новая папка/korol_lev_-_akuna_matata.mp3" 
Code:  2 File:  "D:/Медиа/Аудио/Новая папка/song.mp3" 
Code:  2 File:  "D:/Медиа/Аудио/Новая папка/01-Planetary Sit-In.mp3"


Это сообщение отредактировал(а) Fealeron - 24.8.2010, 14:24
PM MAIL   Вверх
jonie
Дата 24.8.2010, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



GetLastError() смотрели?


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Fealeron
Дата 24.8.2010, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(jonie @ 24.8.2010,  20:26)
GetLastError() смотрели?

Нет, не смотрел. Потому, что прочитал вот что:
Цитата

Do not use GetLastError with the return values of this function.

Вот тут: MSDN - SHFileOperation Function
PM MAIL   Вверх
ncr
Дата 25.8.2010, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Fealeron @ 24.8.2010,  20:59)
Нет, не смотрел. Потому, что прочитал вот что:

Ну так дочитайте до конца что ли:

Цитата
To examine the nonzero values for troubleshooting purposes, they largely map to those defined in Winerror.h. However, several of its possible return values are based on pre-Win32 error codes, which in some cases overlap the later Winerror.h values without matching their meaning.

PM MAIL   Вверх
586
Дата 25.8.2010, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

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



Цитата(Fealeron @  24.8.2010,  15:20 Найти цитируемый пост)
file_for_delete += "\0\0";

Так нули не добавятся. Можно вот так написать:
Код
#include <windows.h>
#include <shellapi.h>
#include <tchar.h>

        TCHAR *file_for_delete = new TCHAR[str.length()+2];
        _tcscpy(file_for_delete, str.utf16());
        file_for_delete[str.length()+1] = _T('\0');   // добавление второго нуля

        SetFileAttributes(file_for_delete,FILE_ATTRIBUTE_ARCHIVE);
        SHFILEOPSTRUCT shfo={0};
        shfo.wFunc=FO_DELETE;
        shfo.pFrom = file_for_delete;
        shfo.fFlags =FOF_NOCONFIRMATION | FOF_SIMPLEPROGRESS | FOF_NOERRORUI | FOF_ALLOWUNDO;
        shfo.fAnyOperationsAborted=false;
        shfo.hNameMappings=NULL;
        shfo.pTo = NULL;
        shfo.lpszProgressTitle=NULL;
        int res = SHFileOperation (&shfo);
        delete []file_for_delete;
        qDebug() << "Code: " << hex << res << "File: " << file_for_delete;
        return res;


Это сообщение отредактировал(а) 586 - 25.8.2010, 14:18
PM   Вверх
Fealeron
Дата 25.8.2010, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(586 @ 25.8.2010,  12:26)
Цитата(Fealeron @  24.8.2010,  15:20 Найти цитируемый пост)
file_for_delete += "\0\0";

Так нули не добавятся. Можно вот так написать:
Код
...
        _tcscpy(file_for_delete, str.utf16());
...


Вы правы, всё дело в нулях.
Правда и Ваш случай у меня не заработал, проблема была в той строчке, что я оставил. 
_tcscpy(char*, const char*) 
Если с TCHAR* ещё принимала такое: (char*)file_for_delete.
То с str.utf16() оно работать не хотело не принимая  const ushort* там, где требовало const char* и как быстро превращение сделать я не знаю.
Поэтому, я решил сделать проще, хоть и менее красиво:
Код

#include <windows.h>
#include <shellapi.h>

        QString file_for_delete = str;
        
        file_for_delete.append("69");                           // добавляем в конец строки два символа, увеличивая её длину
        file_for_delete[file_for_delete.size()-2] = 0;          // заменяем два последних символа, которые только что добавили
        file_for_delete[file_for_delete.size()-1] = 0;          // на '\0'
        
        SHFILEOPSTRUCT shfo={0};
        shfo.wFunc=FO_DELETE;
        shfo.pFrom = (wchar_t*)(file_for_delete.utf16());
        shfo.fFlags =FOF_NOCONFIRMATION | FOF_SIMPLEPROGRESS | FOF_NOERRORUI | FOF_ALLOWUNDO;
        shfo.fAnyOperationsAborted=false;
        shfo.hNameMappings=NULL;
        shfo.pTo = NULL;
        shfo.lpszProgressTitle=NULL;
        int res = SHFileOperation (&shfo);
        qDebug() << "Code: " << hex << res << "File: " << file_for_delete;
        return res;

После этого все файлы нормально удаляются.
Всем спасибо, вопрос исчерпан. smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


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

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


 




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


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

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