Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

SHFileOperation - Cannot read from the source file or disk [D6]


miwa ©   (2004-06-17 21:56:00) 

Вот никогда не думал, что сам спрошу "как стереть папку з всеми файлами?" :о)) И тем не менее: приведенный код выдает сабж:

         try
           s:='"'+clbClients.Items[i] + clbFolders.Items[j]+'"';
           FillChar(sh, sizeof(sh), 0);
           sh.Wnd:=Handle;
           sh.wFunc:=FO_DELETE;
           sh.pFrom:=pchar(s);
           sh.fFlags:=FOF_NOCONFIRMATION;
           SHFileOperationA(sh);
         finally
           if (FileExists(s) or DirectoryExists(s))
           then lstLog.Items.Add('Error: '+s)
           else lstLog.Items.Add('OK: '+s);
         end;

В результате получаю сперва окошечко с сабжем, а потом в lstLog.Items добавляется строка OK: "D:\qwert".
Может, проблема в ОСи (вин2К3)?


Anatoly Podgoretsky   (2004-06-18 08:57:00) [1]

И два нуля в конце добавлять не нужно, для строк один добавится автоматом


miwa   (2004-06-18 07:38:00) [2]

У всех прошу прощения, как всегда, ошыбки элементарны:
1.
Было: S:='"'+some1+some2+'"';  
Надо: S:=some1+some2;
2. Подсказки [1] и [11].

Всем спасибо.


miwa   (2004-06-18 07:29:00) [3]

Нет, симптомы те же: сперва "Cannot delete file: Cannot read from source file or disk" а потом "A call to OS function failed".
Вот чего понять не могу: рыскал в нете, в основном эта проблема возникает либо при нехватке прав доступа, либо при попытке удалить системные папки типа "панели управления", либо при открытых кем-то файлах, которые удаляются. Но вот так - для любых файлов-папок...


pasha_golub   (2004-06-18 06:46:00) [4]

with SHFileOpStruct do
     begin
       Wnd    := fmDialog.Handle;   // Assign the window handle
       wFunc  := FO_DELETE;        // Specify a file delete
       pTo    := nil;
       if ModRes = mrNo then fFlags := FOF_NOCONFIRMATION;
       fFlags := fFlags or FOF_ALLOWUNDO;
       fAnyOperationsAborted := False;
       hNameMappings := nil;
       lpszProgressTitle := nil;
       pFrom := PChar(AFromDir+#0#0);
     end;
SHFileOperation(SHFileOpStruct);

Двойной завершающий ноль поставь


miwa   (2004-06-18 00:42:00) [5]

[9]

> Ну так надо знать код ошибке GetLastError

[4]

> В результате lstLog.Items.Add(SysErrorMessage(GetLastError))
> получаю "Operation completed successfully"



> Для возбуждения исключения можно использовать процедуру
> RaiseLastOSError

A call to OS function failed.
Осталось узнать, почему...


Anatoly Podgoretsky   (2004-06-18 00:34:00) [6]

Для возбуждения исключения можно использовать процедуру RaiseLastOSError


Anatoly Podgoretsky   (2004-06-18 00:31:00) [7]

Ну так надо знать код ошибке GetLastError


miwa   (2004-06-18 00:16:00) [8]

Ясно, спасибо, запомню.
Но результат все же неутешительный: для любых данных ругательство со стороны функции. Для любых файлов, папок; с любыми правами доступа и т.п.


Anatoly Podgoretsky   (2004-06-18 00:05:00) [9]

Иключения из АПИ не будет, надо обработать результат


miwa   (2004-06-17 23:47:00) [10]

И, кстати, что интерессно, если изменить код примерно вот так:

         try
            * * *
           if SHFileOperationA(sh) <> 0 then lstLog.Items.Add(SysErrorMessage(GetLastError));
           except
           on err: exception do showmessage(err.Message);
         end;

блок except не срабатывает. Вот...


miwa   (2004-06-17 23:45:00) [11]


         try
           s:='"'+clbClients.Items[i] + clbFolders.Items[j]+'"';
           FillChar(sh, sizeof(sh), 0);
           sh.Wnd:=Handle;
           sh.wFunc:=FO_DELETE;
           sh.pFrom:=pchar(s+#0);
           sh.fFlags:=FOF_NOCONFIRMATION;
           if SHFileOperationA(sh) <> 0 then lstLog.Items.Add(SysErrorMessage(GetLastError));
         finally
         end;

Все то же :о(( - окошечко во время работы функции: Cannot delete file: cannot read from source file or disk.
В результате lstLog.Items.Add(SysErrorMessage(GetLastError)) получаю "Operation completed successfully" 8:o|.


Anatoly Podgoretsky   (2004-06-17 23:40:00) [12]

Не добавляет, сделай pchar(S+#0)
И обязательно проверять результат функции.


miwa   (2004-06-17 23:35:00) [13]


> 1, Где проверка на ошибку?

Когда вызываю функцию, она сама выдает сообщение об ошибке не взирая на то, что должна просто возвращать 0 или код ошибки. Тоесть, при коде типа

r:=shfileoperation(sh);
if f <> 0 then ...

все равно вываливается то жесообщение.


> 2. Где завершающий ноль?

А что, код sh.pFrom:=pchar(s);не добавляет этот самый ноль?


Anatoly Podgoretsky   (2004-06-17 22:27:00) [14]

1, Где проверка на ошибку?
2. Где завершающий ноль?

Хотел удалить и удалил, а ты что после удаления папки хочешь получить Error: "D:\qwert".?


Наверх

Титульная страница Поиск, карта сайта Написать письмо