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

Вниз

Блокировка папки после создания   Найти похожие ветки 

 
ANB ©   (2005-04-25 16:55) [0]

Создаю папку CreateDirectory, затем, не выходя из свое проги, пытаюсь удалить ее

lpFileOp.Wnd := 0;
lpFileOp.wFunc := FO_DELETE;
lpFileOp.pFrom := PChar(sSource);
lpFileOp.pTo := nil;
lpFileOp.fFlags := FOF_NOCONFIRMATION or FOF_NOCONFIRMMKDIR or FOF_NOERRORUI;
lpFileOp.fAnyOperationsAborted := False;
lpFileOp.hNameMappings := nil;
lpFileOp.lpszProgressTitle := "TestSoft : Удаление файлов";
Err := SHFileOperation (lpFileOp);
if (Err <> 0) then begin
 sErrMsg := SysErrorMessage(Err);
 Result := "Ошибка при удалении файла/папки ""
 + sSource
 + "" ("
 + IntToStr(Err) + ") ""
 + sErrMsg + """;
end;
- ничего не выходит и код ошибки не расшифровывается (1026).
Но если выйти/зайти, то все удаляется. Похоже на блокировку папки (не закрыт хендл), только откуда она берется ?


 
VMcL ©   (2005-04-25 18:25) [1]

>>ANB ©   (25.04.05 16:55)

> ничего не выходит и код ошибки не расшифровывается (1026).

Вероятно, потому что нужно почитать справку по SHFileOperation, где написано:
Return Value
Returns zero if successful, or nonzero otherwise.


Вывод: Err := GetLastError, а не SHFileOperation.


 
ANB ©   (2005-04-26 09:25) [2]


> Вывод: Err := GetLastError, а не SHFileOperation.
- не, это я пробовал, грит, что нету ошибки. Видно, ошибка не OS. А может я зря пытаюсь удалять SHFileOperation ? Правда, он и пустую папку не удаляет . . . Может я с CreateDirectory намутил ?
Вот так делаю :

if (not CreateDirectory(PChar(sSource), nil)) then begin
 Err := GetLastError;
 sErrMsg := SysErrorMessage(Err);
 Result := "Ошибка при создании папки ""
 + sSource
 + "" ("
 + IntToStr(Err) + ") ""
 + sErrMsg + """;
end;
. Может права надо задать вместо nil ? Папка почему то получается с флагом ReadOnly.


 
alpet ©   (2005-04-26 11:07) [3]

Попробуй по шаблону создавать:
CreateDirectoryEx(".", PChar (sSource), nil);


 
ANB ©   (2005-04-26 16:12) [4]

Похоже проблема в использовании SHFileOperation.
Потому как при копировании такая же ошибка вылезла.
Функция возвращает 1026 и если включить окно сообщений, то вылезает :
Не удается скопировать файл. Не удается произвести чтение из файла или с диска.


 
ANB ©   (2005-04-26 16:33) [5]

Ничего не понимаю. Для большей части папок все работает, а для некоторых вываливается эта ошибка. Причем, через винду все прекрасно копируется, ничего не глючит.


 
ANB ©   (2005-04-26 16:38) [6]

Ничего не понимаю. Для большей части папок все работает, а для некоторых вываливается эта ошибка. Причем, через винду все прекрасно копируется, ничего не глючит.


 
ANB ©   (2005-04-26 16:53) [7]

Ничего не понимаю. Для большей части папок все работает, а для некоторых вываливается эта ошибка. Причем, через винду все прекрасно копируется, ничего не глючит.


 
alpet ©   (2005-04-26 17:36) [8]

Про хэндлы, в MSDN наблюдается некоторое противоречие:

hNameMappings
A handle to a name mapping object containing the old and new names of the renamed files. This member is used only if the fFlags member includes the FOF_WANTMAPPINGHANDLE flag. See Remarks for more details.

В ремарках же:

However, on Windows NT 4.0 and later, SHFileOperation always returns a handle to a Unicode set of SHNAMEMAPPING structures.
...
Note  The handle must be freed with SHFreeNameMappings.

When used to delete a file, SHFileOperation attempts to place the deleted file in the Recycle Bin. If you wish to delete a file and guarantee that it will not be placed in the Recycle Bin, use DeleteFile.

Не знаю что еще здесь может помешать. Может функция хочет что-бы строки были приведены в C формат?


 
ANB ©   (2005-04-26 17:53) [9]

Привел. . . Блин, я уже задрался и написал рекурсивное копирование и удаление папок. И все замечательно работает. Хотя, для общего развития, неплохо было выяснить, в чем тут глюк.


 
alpet ©   (2005-04-26 17:57) [10]

[8] Имеется ввиду в C что косые должны дублироваться. То есть путь может выглядеть как: "C:\\Temp\\Folder1"


 
ANB ©   (2005-04-26 18:03) [11]

Не, тогда бы никакие папки не копировались и не удалялись. А так только некоторые. Причем закономерности я не нашел. Но если не хочет удалятся с каким то именем, то даже если я ее ручками создам - все равно не удаляется.


 
alpet ©   (2005-04-26 18:17) [12]

ANB ©   (26.04.05 18:03) [11]
Я проверил, действительно одинарные косые.
Впрочем обнаружил закономерность - если зайти Tootal Commander в одну из папок - удалить ее программа не сможет.


 
alpet ©   (2005-04-26 18:28) [13]

Хотя нет, иногда удаляет. Странный трабл. А насчет ошибки 1026, надо купить трехтомник "Недокументированные ошибки WindowsXP". Собственно если какой-то процесс находится в папке - он ее занимает. Надо исключить "появление" хотя-бы текущего процесса в этой папке (SetCurrentDirectory ("\");).


 
Anatoly Podgoretsky ©   (2005-04-26 18:30) [14]

Ошибка в sSource


 
ANB ©   (2005-04-27 09:16) [15]


> Anatoly Podgoretsky ©   (26.04.05 18:30) [14]
- в отладчике смотрел и в лог скидывал ее содержимое. Там все, как я хотел. И прямое присваивание константы делал. Эффекта 0. Например, папку Data ест в любом варианте, а SUPPORT ниоткуда не хочет. И руками в корне создавал - без толку.
sSource : String; Согласно теории, приведение ее к PChar полностью корректно.
Может я не так флаги поставил или чего то не заполнил в структуре ? Есть у кого нибудь корректный пример использования
SHFileOperation для удаления или копирования папок ?


 
alpet ©   (2005-04-28 15:05) [16]

PChar("C:\\Temp\\SUPPORT") удаляется везде и на ура, тогда как PChar("C:\Temp\SUPPORT") не хочет удаляться совсем. Стало быть косые должны удваиваться. Тем не менее на "присутствие" в папках лишних процессов вроде totalcmd система иногда ругается, но вполне осмысленно - например "Немогу удалить папку SUPPORT. Обьект используется пользователем или программой. Закройте все программы, которые могут использовать этот файл и повторите попытку".


 
ANB ©   (2005-04-28 16:32) [17]


> PChar("C:\\Temp\\SUPPORT")
- а разве для си двойные косые не на этапе компиляции убираются ? И почему папка PChar("D:\Data") нормально удаляется ?
to
> Anatoly Podgoretsky, Игорь Шевченко и Digitman

разрулите тему, плз нижайшее ....


 
alpet ©   (2005-04-28 17:33) [18]


>- а разве для си двойные косые не на этапе компиляции убираются ? И почему папка PChar("D:\Data") нормально удаляется ?

Убираются насколько мне известно. Почему удаляется:

Escape sequences:

\a Bell (alert)
\b Backspace
\f Formfeed
\n New line
\r Carriage return
\t Horizontal tab
\v Vertical tab
\" Single quotation mark
\"  Double quotation mark
\\ Backslash
\? Literal question mark
\ooo ASCII character in octal notation
\xhh ASCII character in hexadecimal notation
\xhhhh Unicode character in hexadecimal notation if this escape sequence is used in a wide-character constant or a Unicode string literal.


Повидимому не распознаные последовательности за последовательности не принимаются, то есть "\D" это два символа, а не последовательность.


 
ANB ©   (2005-04-28 17:45) [19]

Дык и последовательности должны в си на компиляции преобразовываться, мы же на делфи пишем . . . Тут никаких последовательностей нету, кроме ""


 
alpet ©   (2005-04-28 18:08) [20]

Я и сам не улавливаю как здесь все работает. Но факт - при указании удвоенных косых - удаление проходит без проблем, более того - хватает указания для лишь первого вхождения (C:\\TEMP\SUPPORT - удаляется). Так-что косые+символы в данном случае не являются последовательностями.


 
ANB ©   (2005-04-29 09:34) [21]

Хм. Получается, что двойными косыми нужно отделить имя диска. А у меня и ошибка как раз вылазит при одной косой - не могу прочитать устройство . . . Чего то мастера мой топик не смотрят.


 
alpet ©   (2005-04-29 12:44) [22]

Поздравляю, мы с тобой очень невнимательно читали MSDN. Дело не в косых, а в формате строк структуры SHFILEOPSTRUCTA - pFrom должна завершаться двойным нулем.  

Например:
lpFileOp.pFrom := PChar("C:\Temp\Tiny"#0);

Вот текст из MSDN:
Address of a buffer to specify one or more source file names. These names must be fully qualified paths. Standard Microsoft® MS-DOS® wild cards, such as "*", are permitted in the file-name position. Although this member is declared as a null-terminated string, it is used as a buffer to hold multiple file names. Each file name must be terminated by a single NULL character. An additional NULL character must be appended to the end of the final name to indicate the end of pFrom.


 
ANB ©   (2005-04-29 13:48) [23]

Вот блин. Я думал, это только для нескольких файлов. А функция, похоже, лезла дальше, если там был 0, то все ОК, а если нет - читал, что попало и пытался удалять. Вот и появлялась моя ошибка. А я уже все на рекурсию переделал. :((( Alpet - ты крут. Снимаю шляпу.



Страницы: 1 вся ветка

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

Наверх





Память: 0.51 MB
Время: 0.04 c
10-1094535960
Cobalt
2004-09-07 09:46
2005.06.29
Помогите найти ошибку в коде


4-1115541375
psa247
2005-05-08 12:36
2005.06.29
RegOpenKey


14-1116885359
Германн
2005-05-24 01:55
2005.06.29
Постоянно работающий Windows


4-1115378145
shein
2005-05-06 15:15
2005.06.29
Как проверить имя польз-ля/пароль в домене WinNT?


1-1118062914
Олег из Москвы
2005-06-06 17:01
2005.06.29
Непонятные ошибки.





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