Главная страница
    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.032 c
1-1089936646
AlexR
2004-07-16 04:10
2004.08.01
Как отследить мессадж WM_KeyDown при редактировании Edita


3-1089196035
AlexanderSK
2004-07-07 14:27
2004.08.01
Удаление первичного ключа


4-1086938374
leonidus
2004-06-11 11:19
2004.08.01
Плавающее окошко как у FlashGet


1-1089804769
CTAPbIi
2004-07-14 15:32
2004.08.01
Закрытие модальной формы.


6-1085932270
Sn
2004-05-30 19:51
2004.08.01
Немогу принять ответ сервера UDP





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский