• Vova (12.11.08 14:21) [0]
    Подскажите пожалуйста новичку,
    Я пытаюсь удалить файл функцией DeleteFile
    Всё нормально, но когда атрибут файла "только для чтения" функция не хочет его удалять и выдает ошибку #5,
    В windows можно ведь любые файлы удалять и "только для чтения" и с другими атрибутами, как мне это сделать?
  • clickmaker © (12.11.08 14:25) [1]
    сначала сбрось атрибут
  • Vova (12.11.08 15:10) [2]

    > сначала сбрось атрибут


    Сделал так как Вы посоветовали - работает, спасибо!
    (
    if GetFileAttributes(PChar(fileName)) = 33 then
               SetFileAttributes(PChar(fileName), 32);
    )
  • Поросенок Винни-Пух © (12.11.08 15:18) [3]
    неверно.
  • clickmaker © (12.11.08 15:52) [4]
    > [2] Vova   (12.11.08 15:10)

    а если у файла окажутся еще атрибуты кроме 32 и 1?
  • Anatoly Podgoretsky © (12.11.08 16:44) [5]
    > Vova  (12.11.2008 15:10:02)  [2]

    Неправильно, но для простейшего случая, тем более для удаления пойдет.
  • Anatoly Podgoretsky © (12.11.08 16:44) [6]
    > clickmaker  (12.11.2008 15:52:04)  [4]

    Ничего страшного, удалятся только часть файлов.
  • Vova (13.11.08 00:45) [7]

    > Неправильно, но для простейшего случая, тем более для удаления
    > пойдет.


    Надо сделать правильно, как сделать правильно?
  • Palladin © (13.11.08 08:53) [8]

    > Надо сделать правильно, как сделать правильно?

    изучить, что такое биты и как с ними работать. операции or, and
    ну и xor и not до кучи. понять что такое атрибуты файла, как они хранятся.

    и тогда ты сможешь сделать правильно.
  • Рамиль © (13.11.08 08:57) [9]
    Атрибут файла это dword, каждый бит отвечает за какой либо атрибут (или зарезервирован). Соот. надо сбросить биты readonly, hidden, system.

    http://msdn.microsoft.com/en-us/library/aa915578.aspx
  • Vayrus (21.11.08 10:06) [10]
    function DeleteFileMain(ABWG: String): Boolean;
    begin
    RESULT := SetFileAttributes(PChar(ABWG), 0);
    if RESULT then
    begin
    RESULT := DeleteFile(PChar(ABWG));
    Application.ProcessMessages;
    Sleep(500);
    Application.ProcessMessages;
    end;
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    if DeleteFileMain('test.exe') then
    ShowMessage('Done') else
    ShowMessage('Error');
    end;

  • Riply © (21.11.08 11:14) [11]
    > [10] Vayrus   (21.11.08 10:06)

    А можно пояснить код ?
  • Anatoly Podgoretsky © (21.11.08 11:27) [12]

    > Vayrus   (21.11.08 10:06) [10]

    Еще один, которые не читал http://www.podgoretsky.com/OtherParts/DM/BadWill.aspx №4
  • Anatoly Podgoretsky © (21.11.08 11:29) [13]

    > А можно пояснить код ?

    Психотренировку пройти хочешь?
  • Riply © (21.11.08 11:34) [14]
    > [13] Anatoly Podgoretsky ©   (21.11.08 11:29)

    > Психотренировку пройти хочешь?

    Неа. Просто интересно :)
  • Anatoly Podgoretsky © (21.11.08 11:42) [15]
    > Riply  (21.11.2008 11:34:14)  [14]

    Тогда ты рисковый игрок :-)
  • Palladin © (21.11.08 11:50) [16]

    > А можно пояснить код ?

    пояснения просты: откуда то содрано :)
  • clickmaker © (21.11.08 12:05) [17]
    DeleteFileMain наводит на мысль, что должна быть еще функция для не главных файлов
  • Anatoly Podgoretsky © (21.11.08 12:30) [18]
    А может не главная?
  • Vayrus (21.11.08 14:20) [19]

    > Еще один, которые не читал http://www.podgoretsky.com/OtherParts/DM/BadWill.
    > aspx №4


    Реклама?


    > пояснения просты: откуда то содрано :)


    Наглая лож, не всем же откуда то сдирать


    > DeleteFileMain наводит на мысль, что должна быть еще функция
    > для не главных файлов


    Ни на че не наводит, взято на абум


    > А может не главная?


    Не надоело до слов докапываться?
  • Vayrus (21.11.08 14:28) [20]

    > А можно пояснить код ?


    Сначало скидываем все атрибуты файла и если все получилось, то пытаемся удалить, пауза выставлена потому, что функция DeleteFile возвращает результат до того как фактически удалит файл, то есть мы даем, скажем так, дополнительное время для функции. А так как использование ПАУЗЫ подвешивает приложение (или если ты будешь удалять несколько файлов), то пришлось позаботиться и об этом - ProcessMessages.

    Если ТРУЕ то все пучком, иначе что то пошло не так.
  • Palladin © (21.11.08 14:28) [21]

    > Vayrus   (21.11.08 14:20) [19]

    а самое главное это конечно sleep и Application.ProcessMessages :) без этого ничего не заработает
  • Vayrus (21.11.08 14:29) [22]

    > а самое главное это конечно sleep и Application.ProcessMessages
    > :) без этого ничего не заработает


    Заработает для мелковесных файлов
Есть новые Нет новых   [134435   +38][b:0][p:0.001]