Delphi copyfile коды ошибок

    msm.ru

    Нравится ресурс?

    Помоги проекту!

    Пожалуйста, выделяйте текст программы тегом [сode=pas] … [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.


    Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
    1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
    2. Как «свернуть» программу в трей.
    3. Как «скрыться» от Ctrl + Alt + Del (заблокировать их и т.п.)
    4. Как прочитать список файлов, поддиректорий в директории?
    5. Как запустить программу/файл?
    … (продолжение следует) …


    Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
    Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


    Внимание
    Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
    Повторная попытка — 60 дней. Последующие попытки бан.
    Мат в разделе — бан на три месяца…

    >
    Код ошибки при копировании файла — 3
    , Delphi (чайник)

    • Подписаться на тему
    • Сообщить другу
    • Скачать/распечатать тему

      


    Сообщ.
    #1

    ,
    03.08.07, 15:23

      Здрасте!
      Я пытаюсь скопировать файл (.bmp)

      ExpandedWrap disabled

        var copyringDirSrName,copySaveDir:string;

        begin

        copyingDirSrName:=’F:1.bmp’;

        copySaveDir:=’C:’;

         if (copyFile(pChar(copyringDirSrName),pChar(copySaveDir),true)) then

           begin

            showMessage(‘OK!FileCopy!’);

           end

           else

           begin

            showMessage(‘NO!File Not Copy!Код ошибки =’+inttostr(getlasterror));

           end;

        end;

      выдает сообщение

      Цитата

      NO!File Not Copy!Код ошибки = 3

      Я немогу найти код ошибки =3.Не подскажите,что это значит.
      И вообще,я чувствую,что делаю,что-то не так.
      А как правильно копировать файлы?

      Guru

      volvo877



      Сообщ.
      #2

      ,
      03.08.07, 15:27

        Цитата uborshik @ 03.08.07, 15:23

        Я немогу найти код ошибки =3

        Здесь смотрел:
        System Error Codes (0-499)?

        Цитата uborshik @ 03.08.07, 15:23

        я чувствую,что делаю,что-то не так.

        ExpandedWrap disabled

          copySaveDir:=’C:1.bmp’;

        чувствуешь разницу?

        Profi

        uborshik



        Сообщ.
        #3

        ,
        03.08.07, 15:57

          Цитата volvo877 @ 03.08.07, 15:27

          чувствуешь разницу?

          Гм… :unsure:
          Чувствую…


          P.O.D



          Сообщ.
          #4

          ,
          03.08.07, 16:48

            Цитата uborshik @ 03.08.07, 15:23

            Я немогу найти код ошибки =3.Не подскажите,что это значит.

            ExpandedWrap disabled

              ShowMessage(‘NO!File Not Copy! ‘+SysErrorMessage(GetLastError));

            ;)

            Profi

            uborshik



            Сообщ.
            #5

            ,
            03.08.07, 19:49

              P.O.D,volvo877
              Спасибо за помощь!
              Все получилось благодаря вашим советам.
              …………………………………
              З.Ы. Я делал утилитку которая делает txt-список имен файлов в определенной директории (ну,типа,для распечатки на принтере того,что имеется на жестком диске)и подумал,что неплохо было-бы,заодно(раз уж проходим каталоги) иметь возможность копировать определенные файлы с диска на внешние носители,типа,флешки или сотового телефона(в моем случае).
              Я раньше делал «проход файлов»(рекурсивный,описанный в учебниках).Я уже забыл как я это делал.
              А тут срочно понадобилось эта «фенька».
              Пришлось вспоминать…Не смог.
              Пришлось все заново учить(все боялся ,что придется опять на наши Исходники.ру задавать вопросы — ведь «заклюют»,типа,вопрос «изъежженый» до мозга костей).
              Но уж про копирование,я этот вопрос ни разу не задавал здесь!
              (Кстати список имен файлов в директории имеющей 50 папок вмещающих около 2600 файлов делфи-программа составила менее чем за три секунды(комп=1700мг память 1024мб)!
              (Копирование с составлением списка копируемых файлов(100 файлов каждый не более 50кб) составило около 20 секунд).

              Сообщение отредактировано: uborshik — 03.08.07, 20:00

              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

              0 пользователей:

              • Предыдущая тема
              • Delphi: Общие вопросы
              • Следующая тема

              Рейтинг@Mail.ru

              [ Script execution time: 0,0444 ]   [ 16 queries used ]   [ Generated: 3.06.23, 23:55 GMT ]  

              Копирование файлов

              Нет другого такого процесса в программе инсталляции, который бы выглядел снаружи столь простым и был бы в реализации столь сложным, как копирование. Сложная фраза. В переводе на русский язык она означает, что сделать хорошую операцию копирования файлов нелегко :)
              Почему?

              Потому что операция копирования файлов должна быть идеальной.

              Начнём с самого просто случая — копирования одного файла. Для того, чтобы скопировать один файл, вы можете вызвать функцию Windows, которая называется CopyFile:

              function CopyFile(lpExistingFileName, lpNewFileName: PChar; bFailIfExists: BOOL): BOOL; stdcall;
              

              Как видим, функции необходимо передать имена двух файлов: исходного и целевого. Третий параметр отвечает за то, как функция будет поступать, если целевой файл уже существует. Значение True говорит о том, что функция не будет копировать файл, значение False — о том, что целевой файл будет перезаписан.

              Функция возвращает True, если операция копирования была успешно выполнена. Значение False подсказывает нам, что необходимо вызвать функцию GetLastError для того, чтобы узнать код произошедшей ошибки.

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

              if CopyFile(PChar(SourcePath), PChar(TargetPath), False) then 
              // Выполнилась успешно. 
              else 
              // Ошибка. Код ошибки можно получить, вызвав GetLastError.
              

              У этой функции один недостаток, но он способен перекрыть все её достоинства. Мы не имеем доступа к процессу копирования. Это означает, что мы не можем показывать индикатор процесса копирования и не можем прервать функцию CopyFile, если пользователь нажал кнопку «Отмена» или клавишу Escape.

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

              В Windows NT 4.0 появилась новая функция — CopyFileEx, которая позволяет снять все появившиеся проблемы, но добавляет ещё одну — она не работает в Windows 95.

              :)

              В Delphi для копирования файлов, мы можем воспользоваться объектами класса

              TFileStream. Например, так:

              procedure CopyFile(Source, Target: String); 
              var 
              SourceStream: TFileStream; 
              TargetStream: TFileStream; 
              begin 
              SourceStream := TFileStream(Source, fmOpenRead); 
              try 
              TargetStream := TFileStream(Target, fmCreate); 
              try 
              TargetStream.CopyFrom(SourceStream, 0); 
              FileSetDate(TargetStream.Handle, FileGetDate(SourceStream.Handle)); 
              finally 
              TargetStream.Free; 
              end; 
              finally 
              SouceStream.Free; 
              end; 
              FileSetAttr(Target, FileGetAttr(Source)); 
              end; 
              

              Обработку ошибок, как говорится в таких случаях, я оставляю читателю в качестве упражнения… :)

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

              . . . 
              const 
              BlockSize = 65536; 
              . . . 
              var 
              ElapsedSize: Integer; 
              CopySize: Integer; 
              . . . 
              ElapsedSize := SourceStream.Size - SourceStream.Position; 
              while ElapsedSize > 0 do 
              begin 
              if ElapsedSize < BlockSize then 
              CopySize := ElapsedSize 
              else 
              CopySize := BlockSize; 
              TargetSource.CopyFrom(SourceSize, CopySize); 
              ElapsedSize := SourceStream.Size - SourceStream.Position; 
              // Здесь какие-то действия, например, модификация индикатора процесса 
              end; 
              . . . 
              

              Замечательные функции FileGetDate, FileSetDate, FileGetAttr, FileSetAttr выполняют очень важную работу, про которую не надо забывать: копируют дату создания файла и его атрибуты. Сейчас мы не будем углубляться в особенности файловой системы NTFS, в которой есть дата последней модификации файла и расширенные атрибуты, поскольку приведённого кода нам вполне для наших целей хватит.
              Примечание:
              Корректное копирование предполагает, что у целевого файла обязательно устанавливается флаг Archive. Я не буду углуляться в то, зачем это делается, тем более, что в нашем случае этого делать не обязательно.

              Тем не менее, если вы хотите реализовать полноценную операцию копирования, не забудьте про эту маленькую особенность.

              Вот и всё, Удачи!

              Добавил(а): Denismen Дата: 2014-01-25


              Просмотр полной версии : Коды ошибок.


              Люди добрые,подскажите,где найти коды ошибок delphi 7.0 с их описанием на РУССКОМ языке.:(
              Да,и почему при выполнении функции copyfile delphi не копирует на C:?
              Вот что я имею ввиду:procedure TForm1.Button1Click(Sender: TObject);
              begin

              if copyfile(‘d:1.txt’,’d:2.txt’,true) then
              showmessage(‘скопирован’)
              else
              showmessage(Ошибка: ‘+inttostr(getlasterror));
              end;

              end.
              Так работает.Но стоит заменить d на с так ошика №2.


              Люди добрые,подскажите,где найти коды ошибок delphi 7.0 с их описанием на РУССКОМ языке.
              я думаю, такого нету. а даже если есть — то перевод там корявый (например, русский МСДН). так что бери английский хелп к делфи и какой-нибудь словарь (например ABBYY Lingvo 12 :super:) и понимай так

              Но стоит заменить d на с так ошика №2.
              Ошибка №2: ERROR_FILE_NOT_FOUND — The system cannot find the file specified.
              то есть не найден файл. может нет прав на чтение/запись?


              Благодарствую….правда,я сам у себя на компе админ,я думаю мне всё можно…да и файл 1.txt на нём имеется.


              ‘d:1.txt’,’d:2.txt’
              работает без слешей? может, дело в этом
              -или-
              вот описание третьего параметра функции:
              bFailIfExists
              Specifies how this operation is to proceed if a file of the same name as that specified by lpNewFileName already exists. If this parameter is TRUE and the new file already exists, the function fails. If this parameter is FALSE and the new file already exists, the function overwrites the existing file and succeeds.
              попробуй поставить FALSE.


              Все тоже удивляются,что без слешей работает.Отвечу:Да,работает.
              Такой вот метод копирования,скачал его с какого-то сайта посвященного Delphi.Что же про false,то работать однозанчно не будет.
              Копирование файлов
              В delphi есть функция copyfile. Вот ее описание из хелпа
              bool copyfile(

              lpctstr lpexistingfilename, // pointer to name of an existing file
              lpctstr lpnewfilename, // pointer to filename to copy to
              bool bfailifexists // flag for operation if file exists
              );
              Параметры передаваемые в эту функцию:
              Указатель на имя существующего файла (нуль терминированная строка т.е. тип pchar! )
              Указатель на имя файла, который будет создан/перезаписан после копирования (нуль терминированная строка т.е. тип pchar! )
              Если этот параметр true и файл с таким именем уже существует, то функция вернет false. Если же файл, с именем указанным во втором параметре существует и в качестве третьего параметра передан false — то функция перезапишет файл и благополучно завершится.


              Что же про false,то работать однозанчно не будет
              почему не будет?
              сейчас у теья стоит true. из хелпа: If this parameter is TRUE and the new file already exists, the function fails — тоесть, если новый файл есть, функция вернёт ошибку. а если false — перезапишет. так, попробуй


              Прогу сдал…Всем спасибо.


              vBulletin® v3.8.9, Copyright ©2000-2023, vBulletin Solutions, Inc.

              Vladiator

              1574 / 645 / 79

              Регистрация: 24.02.2009

              Сообщений: 9,268

              1

              18.04.2009, 18:12. Показов 14744. Ответов 9

              Метки нет (Все метки)


              Студворк — интернет-сервис помощи студентам

              Delphi
              1
              2
              
              copyfile('C:UsersUsersDesktopTMKPRAD StudioProjectsIndInd.exe',
              'C:Program FilesDDIDDInd.exe',true);

              не работает. Почему?



              0



              Phantom

              Эксперт С++

              3188 / 869 / 39

              Регистрация: 29.12.2008

              Сообщений: 952

              18.04.2009, 18:25

              2

              Так навскидку сказать сложно, попробуй привести параметры внутри к типу PChar:

              Delphi
              1
              2
              
              copyfile(PChar('C:UsersUsersDesktopTMKPRAD StudioProjectsIndInd.exe'),
              PChar('C:Program FilesDDIDDInd.exe'),true);

              Там просто судя по описанию подается как раз в таком виде.

              Если не поможет, попробуй отследить ошибку:

              Delphi
              1
              2
              3
              
              if CopyFile(...) then...
              else
              ShowMessage('Ошибка: '+IntToStr(GetLastError));

              и посмотри её значение в документации.



              0



              1574 / 645 / 79

              Регистрация: 24.02.2009

              Сообщений: 9,268

              18.04.2009, 18:31

               [ТС]

              3

              Ошибка 3.

              Добавлено через 1 минуту 23 секунды
              Документации у меня нет.



              0



              Эксперт С++

              3188 / 869 / 39

              Регистрация: 29.12.2008

              Сообщений: 952

              18.04.2009, 18:34

              4

              Я про встроенный хэлп. Там вроде означает «Неправильные параметры».
              Не помогло приведение к pchar?
              Проверь внимательно пути, всё правильно написал?



              0



              1574 / 645 / 79

              Регистрация: 24.02.2009

              Сообщений: 9,268

              18.04.2009, 18:40

               [ТС]

              5

              1-й путь правильный
              2-й путь я хочу создать, он не существует

              справки у меня нет



              0



              Phantom

              Эксперт С++

              3188 / 869 / 39

              Регистрация: 29.12.2008

              Сообщений: 952

              18.04.2009, 18:50

              6

              C:Program FilesDDIDD есть такая папка? copyfile не создает папки, если их нет. Нужно чтобы папка куда нужно скопировать существовала.
              Скорей всего из-за этого. Создай папку функцией

              Delphi
              1
              2
              
              CreateDir('C:Program FilesDD');
              CreateDir('C:Program FilesDDIDD');

              А потом копируй. Да, кстати, ошибка 3 — это как раз не найден путь.



              0



              1574 / 645 / 79

              Регистрация: 24.02.2009

              Сообщений: 9,268

              18.04.2009, 18:56

               [ТС]

              7

              Новый путь не появляется.



              0



              Phantom

              Эксперт С++

              3188 / 869 / 39

              Регистрация: 29.12.2008

              Сообщений: 952

              18.04.2009, 19:03

              8

              Странно, вот только что прогнал, все работает

              Delphi
              1
              2
              3
              4
              
              CreateDir('C:Program FilesDD');
              CreateDir('C:Program FilesDDIDD');
              copyfile('C:UsersUsersDesktopTMKPRAD StudioProjectsIndInd.exe',
              'C:Program FilesDDIDDInd.exe',true);

              Если и первый путь существует и второй создается… Тогда не знаю.



              0



              1574 / 645 / 79

              Регистрация: 24.02.2009

              Сообщений: 9,268

              18.04.2009, 19:20

               [ТС]

              9

              Эхх.. ну ладно…



              0



              binarymaster

              0 / 0 / 0

              Регистрация: 10.09.2014

              Сообщений: 1

              30.12.2010, 00:39

              10

              Vladiator, если кодируешь консольное приложение, то нужно в uses добавить юнит Windows.

              Delphi
              1
              2
              3
              4
              5
              6
              7
              
              program HelloWorld;
               
              {$APPTYPE CONSOLE}
               
              uses
                SysUtils, Windows;
              ...



              0



              IT_Exp

              Эксперт

              87844 / 49110 / 22898

              Регистрация: 17.06.2006

              Сообщений: 92,604

              30.12.2010, 00:39

              10

              Hello I am using the CopyFile function in Delphi 5. But the file is not getting copied to destination. I am not able to see error also. What is the best way to know why CopyFile is failing?

              if CopyFile(source, dest, false) then
                ShowMessage('Success')
              else
                ShowMessage('Error');
              

              I am getting displayed error always. :(

              Jerry Dodge's user avatar

              Jerry Dodge

              26.8k30 gold badges155 silver badges323 bronze badges

              asked Aug 9, 2012 at 19:12

              Nalu's user avatar

              7

              If the function fails you can get extended error information, calling the GetLastError method or use the RaiseLastOSError method.

              Check this sample

                try
                  If copyFile(source , dest,false) then
                   ShowMessage('Success')
                  else
                   RaiseLastOSError;
                except  on E: Exception do
                   showMessage(Format('Error executing copyFile %s',[E.Message]));
                end;
              

              answered Aug 9, 2012 at 19:19

              RRUZ's user avatar

              RRUZRRUZ

              135k19 gold badges356 silver badges483 bronze badges

              6

              Понравилась статья? Поделить с друзьями:
            • Delphi 7 ошибка при установке
            • Delphi 7 unable to rename delphi32 ошибка
            • Delonghi гриль ошибка op err
            • Delonghi magnifica ошибка очистки
            • Delonghi magnifica ошибка контейнера