![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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".?