Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Удаление файла с помощью SHFileOperation

1.8K
25 июля 2008 года
CilCatblack
251 / / 20.09.2007
При удалении файла с помощью SHFileOperation выдает сообщение:
Неудается удалить файл.Неудается произвести чтение из файла или с диска.:confused:

Код компилируется нормально. Подскажите в чем ошибка?:o
вот код:
Код:
...
   
        CString path="C:\\text.txt\\0";
        SHFILEOPSTRUCT shfo={0};
    shfo.wFunc=FO_DELETE;
    shfo.pFrom=path;
    shfo.fFlags=FOF_NOCONFIRMATION;
    shfo.fAnyOperationsAborted=false;
    shfo.hNameMappings=NULL;
    shfo.lpszProgressTitle=NULL;
        SHFileOperation(&shfo);
...
288
26 июля 2008 года
nikitozz
1.2K / / 09.03.2007
Цитата: CilCatblack

 
Код:
...
   
        CString path="C:\\text.txt\\0";
...



Не совсем понятна вот эта вот строчка. Это опечатка? Или Вы просто хотели поставить два завершающих нуля? По-моему это правильней сделать вот так

 
Код:
char path[MAX_PATH] = "C:\\text.txt";
path[strlen("C:\\text.txt")] = 0;
path[strlen("C:\\text.txt") + 1] = 0;
12K
26 июля 2008 года
lifs
163 / / 06.09.2007
Вот в этом месте опечатка:
 
Код:
CString path="C:\\text.txt\\0";

это путь: С:\text.txt\0. последнии три символа в строке не нужны.
288
26 июля 2008 года
nikitozz
1.2K / / 09.03.2007
Цитата: lifs

последнии три символа в строке не нужны.



Если оставить

 
Код:
CString path="C:\\text.txt"

так, не факт, что заработает. В параметре pFrom в SHFILEOPSTRUCT каждое имя файла должно заканчиваться нулем и в конце должен стоять еще один дополнительный 0. А что будет находиться в памяти где CString хранить строку после C:\\text.txt неизвестно.
12K
26 июля 2008 года
lifs
163 / / 06.09.2007
to nikitozz да, ошибся, ноль в строке нужен
 
Код:
CString path="C:\\text.txt\0";
1.8K
26 июля 2008 года
CilCatblack
251 / / 20.09.2007
Цитата: nikitozz

 
Код:
char path[MAX_PATH] = "C:\\text.txt";
path[strlen("C:\\text.txt")] = 0;
path[strlen("C:\\text.txt") + 1] = 0;


Вот теперь работает:) спасибо.
:)
Но как тогда работать если path класса CString т.е. с переменой класса CString?

288
28 июля 2008 года
nikitozz
1.2K / / 09.03.2007
С CString'ом будет посложнее. Он не дает доступ к памяти, где хранит строку, притом считает, что строка заканчивается нулем, поэтому добавить второй завершающий ноль довольно сложно.
Как вариант, можно вот так:
 
Код:
CString str = "MyText";
    char *sz = NULL;
    sz = new char[str.GetLength() + 2];
    strcpy(sz, (LPCSTR)str);
    sz[str.GetLength()] = 0;
    sz[str.GetLength() + 1] = 0;
           ........................................................
    delete [] sz;
14
28 июля 2008 года
Phodopus
3.3K / / 19.06.2008
Или, как советуют в MSDN, так:
Цитата:

The GetBuffer and ReleaseBuffer member functions allow you to gain access to the internal character buffer of a CString object and modify it directly. The following steps show how to use these functions for this purpose:

Call GetBuffer for a CString object and specify the length of the buffer you require.

Use the pointer returned by GetBuffer to write characters directly into the CString object.

Call ReleaseBuffer for the CString object to update all the internal CString state information, such as the length of the string. After modifying a CString object's contents directly, you must call ReleaseBuffer before calling any other CString member functions.

12K
28 июля 2008 года
lifs
163 / / 06.09.2007
к типу LPCTSTR можно просто привести:
 
Код:
CString str(_T("C:\\test.txt\0"));
LPCTSTR str1 = str;

а SHFILEOPSTRUCT.pFrom как раз имеет тип LPCTSTR

P.S. чем это вариант не подходит?
 
Код:
CString path="C:\\text.txt\0";
1.8K
29 июля 2008 года
CilCatblack
251 / / 20.09.2007
lifs,nikitozz ваши примеры не работают:(
Тема открыта:confused:
12K
29 июля 2008 года
lifs
163 / / 06.09.2007
вот рабочий код
Код:
CString path(_T("C:\\text.txt"));
    path.AppendChar(0);
    path.AppendChar(0);
   
    SHFILEOPSTRUCT shfo={0};
    shfo.wFunc=FO_DELETE;
    shfo.pFrom = path;
    shfo.fFlags=FOF_NOCONFIRMATION;
    shfo.fAnyOperationsAborted=false;
    shfo.hNameMappings=NULL;
    shfo.lpszProgressTitle=NULL;
    SHFileOperation(&shfo);
288
29 июля 2008 года
nikitozz
1.2K / / 09.03.2007
Цитата: CilCatblack
lifs,nikitozz ваши примеры не работают:(



У меня все работает. Вот код.

Код:
CString str = "C:\\TestFile.txt";
    char *sz = NULL;
    int nResult;
   
    sz = new char[str.GetLength() + 2];
    strcpy(sz, (LPCSTR)str);
    sz[str.GetLength()] = 0;
    sz[str.GetLength() + 1] = 0;
   
    SHFILEOPSTRUCT st;
    st.hwnd = this->GetSafeHwnd();
    st.wFunc = FO_DELETE;
    st.pFrom = sz;
    st.pTo = NULL;
    st.fFlags = 0;
    st.fAnyOperationsAborted = false;
    st.hNameMappings = NULL;
    st.lpszProgressTitle = NULL;
    nResult = SHFileOperation(&st);

    delete [] sz;
1.8K
30 июля 2008 года
CilCatblack
251 / / 20.09.2007
Спасибо.:)
Теперь разобрался:)
Испльзовал оба вариана(lifs,nikitozz).

lifs, ИМХО твой вариант лудше:)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог