Ошибка: Failed to parse the Currency Converter XML document.
$23 236.27


Ошибка: Failed to parse the Currency Converter XML document.
$996.53


Ошибка: Failed to parse the Currency Converter XML document.
$1 112.87


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

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

В самом простом случае вопрос копирования файлов очень прост (хотя поступило много пожеланий рассказать именно об этом)! Для этого достаточно посмотреть в хелп по Delphi :))

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

В 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 — то функция перезапишет файл и благополучно завершится.

Приведу небольшой пример использования этой функции. Создайте на диске C:\ файл «1.txt» , а на форму поставьте кнопку:


procedure TForm1.Button1Click(Sender: TObject);
begin
if CopyFile(«c:.txt»,«c:.txt»,true) then
ShowMessage(«Файл успешно скопирован!»)
else ShowMessage(«Неудача!»);
end;

Для того, чтобы точнее узнать при возникновении ошибки, что же все таки произошло, надо воспользоваться функцией GetLastError , которая возвращает код последней ошибки (формат DWORD). Теперь мы немного изменим пример:

procedure TForm1.Button1Click(Sender: TObject);
begin
if CopyFile(«c:.txt»,«c:.txt»,true) then
ShowMessage(«Файл успешно скопирован!»)
else
ShowMessage(«Ошибка! Вот ее код: »+IntToStr(GetLastError));
end;

Таким образом нажав второй раз на кнопку мы получим сообщение: «Ошибка! Вот ее код: 80». Это говорит нам, что файл существует.

Коды всех ошибок можно легко найти в хелпе.

Для углубления рассматриваемого вопроса приведу пример копирования файлов с помощью файлового потока (TFileStream). В приведенной пользовательской функции введены два дополнительных параметра From и Count, которые указывают, соответственно, с какого и по какой байт нужно копировать файл. Если необходимо скопировать весь файл, то необходимо передать нули. Вот код этой функции:

function MyCopyFile( InFile,OutFile: String; From,Count: Longint ): Longint;
var
InFS,OutFS: TFileStream;
begin
InFS := TFileStream.Create( InFile, fmOpenRead );//создаем поток
OutFS := TFileStream.Create( OutFile, fmCreate );//создаем поток
InFS.Seek( From, soFromBeginning );//перемещаем указатель в From
Result := OutFS.CopyFrom( InFS, Count );
InFS.Free;//освобождаем
OutFS.Free;//освобождаем
end;

Удаление файлов

Для удаления файлов в Delphi так же предусмотрена специальная процедура DeleteFile . В качестве параметра, передаваемого в функцию, выступает строка типа PChar, указывающая имя файла, который нужно удалить. Сразу предлагаю Вам простой пример на использование этой функции:

procedure TForm1.Button1Click(Sender: TObject);
begin
if DeleteFile(«c:.txt») then
ShowMessage(«Файл успешно удален!»)
else
ShowMessage(«Ошибка! Вот ее код: »+IntToStr(GetLastError));
end;

Удаление пустой директории

Чтобы удалить пустую директорию с помощью Delphi достаточно обратиться к функции RemoveDir.

function RemoveDir(const Dir: string): Boolean;

Эта функция возвращает True если директория, указанная в единственном параметре, передаваемом в функцию, успешно удалена, в противном случае функция возвратит False.

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

Function MyRemoveDir(sDir : String) : Boolean;
var
iIndex : Integer;
SearchRec : TSearchRec;
sFileName : String;
begin
Result := False;
sDir := sDir + «\*.*»;
iIndex := FindFirst(sDir, faAnyFile, SearchRec);

while iIndex = 0 do begin
sFileName := ExtractFileDir(sDir)+«\«+SearchRec.Name;
if SearchRec.Attr = faDirectory then begin
if (SearchRec.Name <> »« ) and
(SearchRec.Name <> ».«) and
(SearchRec.Name <> »..«) then
MyRemoveDir(sFileName);
end else begin
if SearchRec.Attr <> faArchive then
FileSetAttr(sFileName, faArchive);
if NOT DeleteFile(sFileName) then
ShowMessage(»Could NOT delete « + sFileName);
end;
iIndex := FindNext(SearchRec);
end;

FindClose(SearchRec);

RemoveDir(ExtractFileDir(sDir));
Result := True;
end;

А сейчас пример использования этой функции:

procedure TForm1.Button1Click(Sender: TObject);
begin
if MyRemoveDir(»C:\testDir«) then ShowMessage(»Директория успешно удалена«)
else ShowMessage(»Не получается удалить директорию«);
end;

Общие замечания по данной теме
Перед копированием или удалением файлов всегда проверяйте его наличие функцией FileExists:
if FileExists(»c:.txt«) then
if CopyFile(»c:.txt«,»c:.txt«,true) then
ShowMessage(»Файл успешно скопирован!»)
Чтобы использовать в функциях CopyFile и DeleteFile имена файлов полученные с помощью, например, OpenDialog, надо из привести к типу PChar:
if CopyFile(Pchar(OpenDialog1.FileName),Pchar(SaveDialog1.FileName),true) then ...

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

 

Интересное

Виртуальный выделенный сервер
В последнее время некоторые российские провайдеры стали предоставлять услуги хостинга на виртуальных выделенных серверах. Во всём мире эта услуга не нова. Там, наряду с обычным хостингом, она...
Подробнее...
Чем отличаются Windows XP...
Обе эти системы имеют очень много общего, xp pro и xp home построены на одном и том же ядре, nt 5.1. Разница между ними заключается только в том, что xp home не поддерживает несколько функций,...
Подробнее...
Начало создания сайта
Структура узлаОдним из главных слагаемых успеха узла является правильная организация его структуры. От нее зависит не только удобство навигации, но и легкость его пополнения, добавления разделов....
Подробнее...
Выбираем лучший способ...
Те, кто рассматривает проблемы «одомашнивания» кинотеатра всерьез, при покупке AV-аппарата уделяют больше внимания не передней, а задней панели, то есть коммутационным возможностям. При этом упор...
Подробнее...
Базовая структура сайта,...
Определяя позицию страницы в выдаче по тому или иному поисковому запросу, алгоритмы ранжирования анализируют массу факторов: контент, доменное имя, корректность html-языка (от этого зависит...
Подробнее...
Простой пример навигации...
Простая система навигации для сайтаПриветствую тебя уважаемый читатель!!! Я очень рад что вы читаете эту статью.... почему спросите вы? да потому что это моя первая статья о модном нынче...
Подробнее...
10 фактов, которые нужно...
Технология усиления служб (service hardening) — один из множества новейших механизмов обеспечения безопасности Windows Vista и нового поколения серверов Windows, известных как Longhorn Server....
Подробнее...
Как за нами шпионят
Spyware – это термин, определяющий приложения, которые записывают информацию о поведении пользователя в сети Интернет и сообщают об этом своим создателям. Результатом их действия может стать как...
Подробнее...
Вклады
Выбор депозита – ответственная и сложная задача! 
Подробнее...
Продление периода оценки...
В статье описывается способ продления или повторной активации периода оценки системы Windows Server 2008. Период оценки также называется льготным периодом активации. Приведенные инструкции...
Подробнее...