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

Вниз

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

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

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


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

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


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

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


 
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);


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


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


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

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


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

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


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

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


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

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


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

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


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

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


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

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


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

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


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

5 - это Access Denied.

MSDN Forever.


 
Григорьев Антон   (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;


 
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]

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


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

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


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

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


 
Григорьев Антон   (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: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 ...


 
Андрей Сенченко ©   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.035 c
7-1080541322
Ciberrus
2004-03-29 10:22
2004.05.09
Реестр


4-1079274429
Sergeika
2004-03-14 17:27
2004.05.09
Нужен низкоуровневый хук на клаву WH_KEYBOARD_LL


6-1079823666
Автор
2004-03-21 02:01
2004.05.09
Как программе использовать для вычислений несколько компов в сети


14-1081956180
}|{yk
2004-04-14 19:23
2004.05.09
IBExpert Forms


1-1082631546
CraKer
2004-04-22 14:59
2004.05.09
Курсор..





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