Работа с файлами в Delphi
Работа с файлами в Delphi
Работа с файлами в Delphi В самом простом случае вопрос копирования файлов очень прост (хотя поступило много пожеланий рассказать именно об этом)! Для этого достаточно посмотреть в хелп по Delphi :)) Копирование файлов В Delphi есть функция CopyFile. Вот ее описание из хелпа Листинг 1. функция 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?, а на форму поставьте кнопку: Листинг 2. Код Delphi/Pascal procedure TForm1.Button1Click(Sender: TObject); begin if CopyFile("c:1.txt","c:2.txt",true) then ShowMessage("Файл успешно скопирован!") else ShowMessage("Неудача!"); end; Для того, чтобы точнее узнать при возникновении ошибки, что же все таки произошло, надо воспользоваться функцией GetLastError, которая возвращает код последней ошибки (формат DWORD). Теперь мы немного изменим пример: Листинг 3. Код Delphi/Pascal procedure TForm1.Button1Click(Sender: TObject); begin if CopyFile("c:1.txt","c:2.txt",true) then ShowMessage("Файл успешно скопирован!") else ShowMessage("Ошибка! Вот ее код: "+IntToStr(GetLastError)); end; Таким образом нажав второй раз на кнопку мы получим сообщение: "Ошибка! Вот ее код: 80". Это говорит нам, что файл существует. Коды всех ошибок можно легко найти в хелпе. Для углубления рассматриваемого вопроса приведу пример копирования файлов с помощью файлового потока (TFileStream). В приведенной пользовательской функции введены два дополнительных параметра From и Count, которые указывают, соответственно, с какого и по какой байт нужно копировать файл. Если необходимо скопировать весь файл, то необходимо передать нули. Вот код этой функции: Листинг 4. Код Delphi/Pascal 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, указывающая имя файла, который нужно удалить. Сразу предлагаю Вам простой пример на использование этой функции: Листинг 5. Код Delphi/Pascal procedure TForm1.Button1Click(Sender: TObject); begin if DeleteFile("c:2.txt") then ShowMessage("Файл успешно удален!") else ShowMessage("Ошибка! Вот ее код: "+IntToStr(GetLastError)); end; Удаление пустой директории Чтобы удалить пустую директорию с помощью Delphi достаточно обратиться к функции RemoveDir. Листинг 6. Код Delphi/Pascal function RemoveDir(const Dir: string): Boolean; Эта функция возвращает True если директория, указанная в единственном параметре, передаваемом в функцию, успешно удалена, в противном случае функция возвратит False. Часто возникает необходимость удалить непустую папку, содержащую не только файлы, но и другие вложенные папки. Для этого была написана пользовательская функция, удаляющая папку со всеми файлами и поддиректориями. Вот она: Листинг 7. Функция MyRemoveDir 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; А сейчас пример использования этой функции: Листинг 8. пример использования функции MyRemoveDir procedure TForm1.Button1Click(Sender: TObject); begin if MyRemoveDir("C: estDir") then ShowMessage("Директория успешно удалена") else ShowMessage("Не получается удалить директорию"); end; Общие замечания по данной теме Перед копированием или удалением файлов всегда проверяйте его наличие функцией FileExists: Листинг 9. Код Delphi/Pascal if FileExists("c:1.txt") then if CopyFile("c:1.txt","c:2.txt",true) then ShowMessage("Файл успешно скопирован!") Чтобы использовать в функциях CopyFile и DeleteFile имена файлов полученные с помощью, например, OpenDialog, надо из привести к типу PChar: Листинг 10. Код Delphi/Pascal if CopyFile(Pchar(OpenDialog1.FileName),Pchar(SaveDialog1.FileName),true) then ... Всегда следите за именами файлов, используемых в функциях. Обращайте внимание на абсолютные и относительные пути. Из-за этого часто возникают ошибки, которые сложно отследить! Ну вот наверно и все, что я хотел бы рассказать Вам о копировании и удалении в Delphi. Источник: http://delphid.dax.ru