Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.11;
Скачать: CL | DM;

Вниз

Копирование файлов   Найти похожие ветки 

 
AlexeyV   (2004-04-18 20:16) [0]

Стал делать одну програмку, которая должна переименовывать группы файлов. Для переименования исполизую функцию CopyFile из модуля Windows (пробовал так-же функцию MoveFile). Так вот, дело в том что копирование происходит не всегда, хотя имена файлов не содержат ни каких недопустимых символов. Кто знает в чём дело. и как с этим бороться, подскажите пожалуйста. Буду очень благодарен.


 
Cardinal ©   (2004-04-18 22:12) [1]

Может быть, возникают какие-либо ошибки. Смотрите
возвращаемый функцией результат. Если он "false", то
уточните код ошибки функцией GetLastError.


 
Yanis ©   (2004-04-18 22:40) [2]


type
 TFileAttr = (ftReadOnly, ftHidden, ftSystem, ftVolumeID, ftDirectory, ftArchive, ftNormal);


 
Никита ©   (2004-04-19 08:18) [3]

Вообще-то переименовывать файлы призвана функция Rename


 
Anatoly Podgoretsky ©   (2004-04-19 09:05) [4]

Rename частый случай MoveFile


 
Alexeyv   (2004-04-19 17:35) [5]

C атрибутами у меня всё в порядке, функция GetLastEror возвращает значение 5 что бы это могло значить?


 
WebErr ©   (2004-04-19 17:38) [6]

В отсутствие медиумов, воспользуйтесь:
FormatMessage(...GetLastError...) + F1


 
Григорьев Антон   (2004-04-19 17:51) [7]

5 - это Access Denied.

MSDN Forever.


 
VMcL ©   (2004-04-19 18:16) [8]

>>Григорьев Антон  (19.04.04 17:51) [7]

Windows.pas тоже не лыком шит :)

{ Access is denied. }
ERROR_ACCESS_DENIED = 5;


 
AlexeyV   (2004-04-20 20:57) [9]

Тогда посоветуйте пожалуйста, как же мне всётаки скопировать эти файлы, и что может вызывать эту ошибку?


 
Григорьев Антон   (2004-04-21 09:33) [10]

Не даёт система вам права работать с этими файлами. Может, они в этот момент ещё кем-то используются, может, прав не хватает, а может, это системный файл, с которым никому, кроме самой системы, ничего делать нельзя.


 
Андрей Сенченко ©   (2004-04-21 11:50) [11]

1. Вообще-то пытаться скопировать файл, не проверив предварительно что он никем не занят - некорректно. Может возникнуть сиуация, что в этот файл кто-то что-то пишет, а Вы его копируете. Что получится в результате - сказать не сможет никто.

2. Пытаться удалить файл не проверив его на доступность - тем более. А уж проверять результат удаления - просто необходимо.

Мне в свое время для автоапдэйта своих программок с общего сервера пришлось написать вот такой код:

( не претендую на исключительную корректность и красивость с точки зрения программирования )

 If FindFirst (NewSoftLoc+"*.*",faAnyFile,InstFile) = 0
 then
   repeat
     If (InstFile.Name = ".") or (InstFile.Name = "..")
       then continue;

     If ExtractFileExt(InstFile.Name) = ".ini"
     then
       begin
         // здесь мы апдейтим INI-шки
         // вырезано автором.
       end
     else
       begin
         // здесь мы апдейтим все кроме INI-шек
         If FindFirst(ExtractFilePath(paramstr(0))+InstFile.Name,faAnyFile,TempFile) = 0
         then
           begin
             // если на локалке есть такой файл
             if TempFile.Time < InstFile.Time
             then
               begin
               // если локалке cтарая версия
                 If CheckFileFree(ExtractFilePath(paramstr(0))+TempFile.Name) = true
                 then
                   begin
                   // старый файл свободен
                     If copyFile(pchar(NewSoftLoc+InstFile.Name),pchar(ExtractFilePath(paramstr(0))+TempFile.Name),false)
                     then
                       begin
                       // обновление склалось
                         memo1.Lines.Add("Установлен файл "+InstFile.Name + " " + DateTimeToStr(FileDateToDateTime(InstFile.Time)));
                       end
                     else
                       begin
                       // файл НЕ скопирован
                         memo1.Lines.Add("Ошибка копирования "+TempFile.Name + " " + DateTimeToStr(FileDateToDateTime(TempFile.Time)));
                         InstOK := false;
                       end
                   end
                 else
                   begin
                   // старый файл занят
                     sleep(5000);
                     If CheckFileFree(ExtractFilePath(paramstr(0))+TempFile.Name) = true
                     then
                       begin
                       // старый файл освободился
                         If copyFile(pchar(NewSoftLoc+InstFile.Name),pchar(ExtractFilePath(paramstr(0))+TempFile.Name),false)
                         then
                           begin
                           // обновление склалось
                             memo1.Lines.Add("Установлен файл "+InstFile.Name + " " + DateTimeToStr(FileDateToDateTime(InstFile.Time)));
                           end
                         else
                           begin
                           // файл НЕ скопирован
                             memo1.Lines.Add("Ошибка копирования "+TempFile.Name + " " + DateTimeToStr(FileDateToDateTime(TempFile.Time)));
                             InstOK := false;
                           end
                       end
                     else
                       begin
                         memo1.Lines.Add("Файл недоступен "+TempFile.Name + " " + DateTimeToStr(FileDateToDateTime(TempFile.Time)));
                         InstOK := false;
                       end;
                   end;
               end
             else
               begin
               // версия на локалке совпадает
                 memo1.Lines.Add("Версия совпадает " + TempFile.Name + " " + DateTimeToStr(FileDateToDateTime(TempFile.Time)));
               end;
           end
         else
           begin
           // если на локалке нет такого файла
           if CopyFile(pchar(NewSoftLoc+InstFile.Name),pchar(ExtractFilePath(paramstr(0))+ InstFile.Name),false)
           then
             begin
             // скоприровано успешно
               memo1.Lines.Add("Установлен файл "+InstFile.Name + " " + DateTimeToStr(FileDateToDateTime(InstFile.Time)));
             end
           else
             begin
             // ошибки копирования
               memo1.Lines.Add("Ошибка установки "+InstFile.Name + " " + DateTimeToStr(FileDateToDateTime(InstFile.Time)));
               InstOK := false;
             end;
           end;
         FindClose(TempFile);
       end


 
Андрей Сенченко ©   (2004-04-21 11:52) [12]

Функция проверки файла на доступность у меня лично такая

Function CheckFileFree(fname:string) : boolean;
var
 HFile : hwnd;
begin
 HFile := CreateFile(pchar(fname),
                    GENERIC_READ + GENERIC_WRITE,
                    FILE_SHARE_READ,
                    nil,
                    OPEN_EXISTING,
                    FILE_ATTRIBUTE_NORMAL,
                    0
                    );
 If HFile <> INVALID_HANDLE_VALUE
 then checkfilefree := true
 else checkfilefree := false;
 CloseHandle(HFile);
end;


Хотя многие предпочитают просто
{$I-}
 Assign
 Reset
{$I+}
 If IOResult ...



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

Текущий архив: 2004.04.11;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.088 c
4-1074512776
Max003
2004-01-19 14:46
2004.04.11
Как вызвать процедуру из чужой программы


1-1079680465
DimonNew
2004-03-19 10:14
2004.04.11
Delphi OR C#Builder


4-1075554927
alex732
2004-01-31 16:15
2004.04.11
Нажать кнопку мыши в окне чужого приложения


3-1081658534
iva
2004-04-11 08:42
2004.04.11
компонент редактирования в стиле Object Inspector


14-1079294304
Yegor
2004-03-14 22:58
2004.04.11
TOEFL