Главная страница
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.07 c
8-1084728506
Mihey
2004-05-16 21:28
2004.08.01
Про алгоритм вращения


1-1089996639
luckygluck
2004-07-16 20:50
2004.08.01
MacOs


1-1090392857
Дмитрий 2004
2004-07-21 10:54
2004.08.01
как в Image можно очистить рисунок


14-1089496736
sever-rds
2004-07-11 01:58
2004.08.01
Очередной раз - бегом на кладбище


14-1089718358
syte_ser78
2004-07-13 15:32
2004.08.01
исходники DBTreeView