Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.01;
Скачать: CL | DM;

Вниз

SHFileOperation - Cannot read from the source file or disk   Найти похожие ветки 

 
miwa ©   (2004-06-17 21:56) [0]

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

         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-17 22:27) [1]

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

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


 
miwa ©   (2004-06-17 23:35) [2]


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

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

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

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


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

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


 
Anatoly Podgoretsky ©   (2004-06-17 23:40) [3]

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


 
miwa ©   (2004-06-17 23:45) [4]


         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|.


 
miwa ©   (2004-06-17 23:47) [5]

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

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

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


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

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


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

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


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

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


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

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


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

[9]

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

[4]

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



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

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


 
pasha_golub ©   (2004-06-18 06:46) [11]

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 07:29) [12]

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


 
miwa ©   (2004-06-18 07:38) [13]

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

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


 
Anatoly Podgoretsky ©   (2004-06-18 08:57) [14]

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



Страницы: 1 вся ветка

Текущий архив: 2004.08.01;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.055 c
3-1089063526
Sir John
2004-07-06 01:38
2004.08.01
TclientDataSet и поля с autoincrement


14-1089619301
Alone
2004-07-12 12:01
2004.08.01
Красота по Американски


14-1089616282
Сергей Стоянов
2004-07-12 11:11
2004.08.01
Разработка компьютерной системы для частной клиники


1-1089970982
Гость778
2004-07-16 13:43
2004.08.01
как записать дату в формате dd.mm.yyyy


1-1089808277
goliath
2004-07-14 16:31
2004.08.01
Работа с метафайлами (wmf)