Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.08.01;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.08.01;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.033 c
1-1089892021
BOA_KAA
2004-07-15 15:47
2004.08.01
Запись/чтение файла с помощью TFileStream


1-1090240379
Dmitry
2004-07-19 16:32
2004.08.01
MDI Application


14-1089465018
VID
2004-07-10 17:10
2004.08.01
Как поднастроить файрвол (ZoneAlarm 4.5.538.001)


14-1089453321
GanibalLector
2004-07-10 13:55
2004.08.01
Поиск!!! ICQ-сервер показывает первые 40...


1-1090104009
Hunter2
2004-07-18 02:40
2004.08.01
Файл построчно





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский