Delphi копирование файла код ошибки

Обновлено: 06.07.2024

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

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

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

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

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

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

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

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

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

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

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

Репутация: 3
Всего: 17

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

Глуп тот кто полагается на истину авторитета, а не на авторитет истины
[color=red]KAV&KIS==Evil[/color]

Репутация: 9
Всего: 130


Подозрения неверные: только что сейчас проверил именно на .mdb - всё отлично работает. Смотри, что у тебя в переменной dir: небось там путь несуществующий.

Репутация: 3
Всего: 17

т.е. пытаюсь просто скопировать в туже папку где и БД и лишь меняю имя, эффекта 0:(

Добавлено @ 01:27
пишу тоже самое, но уже с ata.txt все работает

Глуп тот кто полагается на истину авторитета, а не на авторитет истины
[color=red]KAV&KIS==Evil[/color]

Репутация: 23
Всего: 72

Есть мнение, что в GetCurrentDir - не тот путь, по которому лежит эта база.
Итого - не находится не Dest, a Source
Почти уверен, что это верное мнение

Добавлено через 53 секунды
Выход - либо воспользоваться SetCurrentDir, либо явно прописывать полный путь к базе, которую нужно скопировать.

Репутация: 3
Всего: 17

Добавлено через 57 секунд
2Kami есть предложения?

Добавлено через 9 минут и 42 секунды
Я выше попробовал полный путь, не помогло

Глуп тот кто полагается на истину авторитета, а не на авторитет истины
[color=red]KAV&KIS==Evil[/color]

Репутация: 23
Всего: 72


Да.
Только с них надо было начать - посмотреть, что выдает GetLastError

Репутация: 3
Всего: 17

Глуп тот кто полагается на истину авторитета, а не на авторитет истины
[color=red]KAV&KIS==Evil[/color]

Репутация: 23
Всего: 72

Репутация: 3
Всего: 17

из моего последнего поста, вроде как становится ясно, что я невкурсе даже что это такое.
Глуп тот кто полагается на истину авторитета, а не на авторитет истины
[color=red]KAV&KIS==Evil[/color]

Репутация: 23
Всего: 72


Потом скажи здесь результат.
Можешь и сам посмотреть, что означает ошибка: коды ошибок на MSDN

Репутация: 36
Всего: 329

Добавлено через 1 минуту и 15 секунд
Palladin, копировать занятый другой программой файл можно с помощью потока TFileStream.

Репутация: 3
Всего: 17

Однако я еще раз говорю путь указон верно, я проверял на других файлах в этой же папке, не копирует только TableBD.mdb

Глуп тот кто полагается на истину авторитета, а не на авторитет истины
[color=red]KAV&KIS==Evil[/color]

Репутация: 23
Всего: 72

Как, если не секрет? В особенности если этот файл открыт в другой программе без FILE_SHARE_READ . (кроме шуток, действительно интересует этот вопрос).

Люди добрые,подскажите,где найти коды ошибок 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 - то функция перезапишет файл и благополучно завершится.

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

К примеру, программа пытается открыть файл, расположенный на гибком диске, которой еще не готов к работе (не закрыт механизм дискового накопителя, либо диск отсутствует в накопителе).

Ошибки открытия файлов Delphi

Ошибки открытия файлов Delphi

Для того, чтобы программа самостоятельно контролировала результат исполнения операции открытия файла, нужно провести проверку значения функции IOResult (что означает результат ввода/вывода: Input-Output – ввод-вывод, а Result — результат). Функция IOResult принимает значение 0 в случае успешного завершения операции ввода/вывода, иначе возникает код ошибки (не 0).

Автоматическая обработка ошибок Delphi

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

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

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

Ошибки открытия файлов Delphi

Предложим фрагмент программы, который реализует вышеприведенный алгоритм действий.

. . .
AssignFile(fn,filename);

Append(fn) // открываем файл для добавления в него информации

if IOResult<> 0 // ошибка открытия файла then
Rewrite(fn); // открыть файл для записи
// здесь открыт существующий или новый файл
. . .

Перед окончательным завершением своей работы программой должны быть закрыты все открытые файлы. Чтобы это осуществить в языке Delphi, нужно сделать вызов процедуры close. Данная процедура содержит всего лишь один параметр – наименование файловой переменной.

Пример

откуда fn обозначает имя файловой переменной. Итак, мы разобрали некоторые ошибки открытия файлов Delphi. Двигаемся дальше.

Читайте также: