WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  C / C++ / Visual C++
  Проблемы с функцией SHFileOperation (); удаление папки !!!

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   Проблемы с функцией SHFileOperation (); удаление папки !!!
delitant опубликован 17-12-2001 20:36 MSK   Click Here to See the Profile for delitant   Click Here to Email delitant  

Проблемы с функцией SHFileOperation ();
А именно с членом структуры
SHFILEOPSTRUCT sh;
Если
//////
Cstring del=”a:\\temp”;
sh.pFrom = del;
//////
все компилируется но при выполнении банан “Не удается удалить файл. Не удается произвести чтение с устройства”
а если структуру заполнить вот так
sh.pFrom = “a:\\temp”;
ТО ВСЕ РАБОТАЕТ
В чем тут собственно трабл ???
BigBalls опубликован 18-12-2001 10:59 MSK     Click Here to See the Profile for BigBalls  Click Here to Email BigBalls     
С Visual C я работал, но если делать по аналогии с билдером, где есть класс AnsiString, а в нем метод c_str(), который возвращает char*, видимо то же есть и в Cstring. Так надо скорее всего подставлять именно char*.
the_moon опубликован 18-12-2001 10:59 MSK     Click Here to See the Profile for the_moon  Click Here to Email the_moon     
Ну по хорошему pFrom должен указывать
на массив с именем папки заканчивающимся нулем и массив сам должен быть терминирован нулем

Тоесть попробуй так

CString del=”a:\\temp\0\0”;
sh.pFrom = del;

а у тебя в первом случае память под строчку выделялась в куче, а в другом случае в стэке, ну и в случае со стэком тебе просто повезло хотя могло и не заработать или когда нибуть перестанет работать.

Valery опубликован 18-12-2001 11:55 MSK     Click Here to See the Profile for Valery  Click Here to Email Valery     
2the_moon:
добавлять \0 в конце строки не надо, компилятор это делает сам по стандарту.
2delitant:
в первом тобой описанном случае, ты получаешь константный указатель на char, то бишь адрес буфера, который находится в потрохах класса CString. Сам при этом создаешь объект этого класса на стеке. Когда умирает объект (а он обязательно умрет выходя из своей области видимости) он утащит за собой и этот буфер. У тебя на руках останется адрес памяти с мусором скорее всего. Приведи весь кусочек своей функции, тогда можно будет посмотреть получше.
delitant опубликован 18-12-2001 15:30 MSK     Click Here to See the Profile for delitant  Click Here to Email delitant     
вот так работает :

SHFILEOPSTRUCT sh;
sh.hwnd = GetSafeHwnd();
sh.wFunc = FO_DELETE;
sh.pFrom= "a:\\1";
sh.pTo = NULL;
sh.fFlags = FOF_NOCONFIRMATION | FOF_SILENT;
sh.hNameMappings = 0;
sh.lpszProgressTitle = NULL;
SHFileOperation (&sh);

/////////////////////////////////////////////////
а вот так нет !!!!!!!

SHFILEOPSTRUCT sh;
CString del_d="a:\\1";
sh.hwnd = GetSafeHwnd();
sh.wFunc = FO_DELETE;
sh.pFrom= del_d;
sh.pTo = NULL;
sh.fFlags = FOF_NOCONFIRMATION | FOF_SILENT;
sh.hNameMappings = 0;
sh.lpszProgressTitle = NULL;
SHFileOperation (&sh);

//////////////////////////////////////////////
BigBalls !!!
а вот так все ОК!!! но возникает другая пробол
как преобразовать CString --> char* пытался но банан


SHFILEOPSTRUCT sh;
char *del_d=new char[100]; /// !!!!!!!!!!!
del_d="a:\\1";
sh.hwnd = GetSafeHwnd();
sh.wFunc = FO_DELETE;
sh.pFrom= del_d;
sh.pTo = NULL;
sh.fFlags = FOF_NOCONFIRMATION | FOF_SILENT;
sh.hNameMappings = 0;
sh.lpszProgressTitle = NULL;

SHFileOperation (&sh);

Valery опубликован 19-12-2001 08:52 MSK     Click Here to See the Profile for Valery  Click Here to Email Valery     
Ну, уж если ты действетельно просто жить не можещь без CString, то действовать придется так:
SHFILEOPSTRUCT sh;
CString del_d = "c:\\1";
del_d.LockBuffer();
sh.hwnd = GetSafeHwnd();
sh.wFunc = FO_DELETE;
sh.pFrom= del_d.GetBuffer(del_d.GetLength()+1);
sh.pTo = NULL;
sh.fFlags = FOF_NOCONFIRMATION | FOF_SILENT;
sh.hNameMappings = 0;
sh.lpszProgressTitle = NULL;

SHFileOperation(&sh);

Приведенный тобой код (1) действительно не работает, и самое противное не очень понимаю почему :( Надо бы порыться в исходниках оператора приведения типа, может там чего забавного найду.

the_moon опубликован 19-12-2001 10:59 MSK     Click Here to See the Profile for the_moon  Click Here to Email the_moon     
Вот код который работает для файлов наверняка и дл директорий

void CCMVCExtractor::DeleteBAKFiles()
{
CString Files;

SHFILEOPSTRUCT* FOperation = new SHFILEOPSTRUCT;

if( NULL == FOperation ) return;

memset( FOperation, 0, sizeof( SHFILEOPSTRUCT ) );

FOperation->hwnd = NULL;
FOperation->wFunc = FO_DELETE;
FOperation->fFlags = FOF_NOCONFIRMATION /* | FOF_NOERRORUI*/ ;
FOperation->fAnyOperationsAborted = FALSE;
FOperation->hNameMappings = NULL;
FOperation->lpszProgressTitle = "Deleting backup files";

this->Message( "Delete buckup files..." );

for( int i = 0; i < this->FileList.GetSize(); i++ )
{
if( this->FileList.GetAt(i).GetBAKFile( ).GetLength() )
{

if( (_access( this->FileList.GetAt(i).GetBAKFile( ), 0 )) != -1 )
{
Files += this->FileList.GetAt(i).GetBAKFile( );
Files += '\0';

this->Message( this->FileList.GetAt(i).GetBAKFile( this->m_CMVCParam->Root ) );
}

}
}

Files += '\0';


FOperation->pFrom = Files;
FOperation->pTo = NULL;

if( SHFileOperation( FOperation ) )
{
this->Message( "Delete operation failed!");
}

delete FOperation;
}

СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.