Текущий архив: 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.48 MB
Время: 0.034 c