Delphi имя исполняемого файла

Имена

Работа с файлами и директориями

Delphi site: daily Delphi-news, documentation, articles, review, interview, computer humor.

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

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

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

Для удаления директорий есть отдельная функция:

Функция возвращает true, если операция прошла успешно, и false, если неудачно.

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

ChDir(‘Путь к папке, которая будет использоваться по умолчанию’); Это процедура, и у нее нет возвращаемого значения.

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

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

FileExists » ‘Имя или полный путь к файлу’);.

Узнать о существовании директории можно с помощью следующей функции:

Вот небольшой пример использования описанных функций:

В этом примере сначала изменяется текущая директория на корень диска С. После этого происходит проверка: если существует файл autoexec.bat, то он удаляется из текущей директории.

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

Source, Dest: Integer; Len: Integer; Destination: const

GetMem(CopyBuffer, ChunkSize) ; try

Source:»FileOpen(FileName, fmShareDenyWrite);//Открыть файл-источник if Source » 0 then raise EFOpenError.CreateFmt(SFOpenError, [FileName]); try

Dest := FileCreate(Destination); //Создать файл-приемник if Dest » 0 then raise try

//Считать порцию файла

BytesCopied’.=FiieRead(Source,CopyBufЕегЛ,ChunkSize); if BytesCopied » 0 then //Если порция считана, то. //Записать ее в файл-приемник FileWrite(Dest, Copy-Buffer», BytesCopied); until BytesCopied » ChunkSize; finally

Процесс копирования очень прост. Процедура получает два имени файла: откуда копировать, и куда. После этого происходит проверка. Если в качестве второго параметра (путь к файлу, в который надо скопировать)’ указана только директория без имени файла, то программа подставляет в качестве имени файла имя источника.

После этого источника открывается для чтения данных с запретом на запись со стороны других программ. Открыв источник, процедура создает файл приемника. Если он существовал, то без каких-либо предупреждений файл будет перезаписан. Дальше запускается цикл, в котором из файла источника считываются данные по 8 192 байт и тут же записываются в файл приемника. Таким образом, в цикле происходит копирование файла небольшими порциями. Чем больше порция, тем быстрее будет происходить копирование.

Теперь посмотрим на реализацию функции перемещения файлов (листинг 3.14). |1иС™нг^

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

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

Чтобы ее использовать, нужно добавить это описание в свой модуль. Только не забудьте добавить еще в раздел uses модуль shellAPi, иначе проект нельзя будет скомпилировать.

Читайте также:  Какой цвет соответствует какому имени

У функции четыре параметра.

П Имя ‘ файла, или полный путь к файлу, который надо запустить.

□ Параметры, которые надо передать запускаемой программе (то, что нужно написать в командной строке).

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

□ Способ отображения запущенного файла. Набор способов идентичен тому, ЧТО МЫ ИСПОЛЬЮВатИ В функции Showwindow.

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

С помощью этой же функции можно запускать Internet Explorer (или другой браузер, который установлен по умолчанию) и загрузить Интернет-страничку:

Если нужно создать электронное письмо, то это можно сделать следующим способом:

Функцию ShellExecute мы уже рассматривали в разд. 2.5, и все же я решил описать ее еще раз, чтобы выделить в отдельную процедуру. Применяя ее, вам не надо следить за типом pchar, который используется- для передачи строк, потому что наша функция ExecuteFile сама сделает необходимые преобразования.

Теперь нужно добавить панель, на которой мы разместим четыре кнопки: Копировать, Переместить, Удалить, Свойства. Мою форму будущей программы вы можете увидеть на рис. 3.17.

Рис. 3.17. Форма будущей программы работы с несколькими файлами

Теперь перейдите в раздел uses и добавьте туда два модуля: shellapt. и FileCtrl. ПерВЫЙ МОДУЛЬ необходим ДЛЯ работы фуНКЦИИ SHFileOperation. Во ВЮрОМ есть фунКЦИЯ SelectDirectory, которая ВЫЮДИТ на экран стандартное окно выбора директории. Это окно мы будем использовать, когда нужно будет выбрать директорию, в которую надо скопировать или переместить файлы.

В разделе private добавим описание следующей функции:

private < Private declarations >function DoSHFileOp(Handle: THandle; OpMode: UInt; Src, Dest: string; DelRicleBin; Boolean): Boolean; Эта функция будет универсальная: для копирования, перемещения и удаления файлов. Нажмите «Ctrl»+»Shift»+»C», чтобы создать заготовку этой функции. В этой заготовке нужно написать следующее (листинг 3.16).

Листинг3.16. Универсальная функция для работы с файлами Г

function TForml.DoSHFileOp (Handle: THandle; CpMode: UInt; Src,.

Для функции SHFiieOperation нужен только один параметр- структура типа TSHFileOpStruct. Такой переменной является ipFiieOp. Прежде чем использовать эту структуру, мы заполним ее нулями с помощью функции Fiilchar, чтобы там случайно не оказались ненужные данные. Теперь перечислим свойства, которые нужно заполнить.

— путь-источник, который мы получаем в качестве третьего параметра.

После раздела vaг и перед ключевым словом implementation напишите следующий код:

FileOpMode: array[0..3] of UInt =

Теперь создадим обработчики событий для нажатия кнопок нашей панели. Сначала создайте обработчик события onclick для кнопки Копировать. В нем нужно написать следующий код (листинг 3.17).

for i := 0 to do if (ShellListViewl.items.item[i].Selected) then begin FSrc:=FSrc+

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

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

Рис. 3.18. Окно выбора директории

Теперь нужно узнать директорию, из которой происходит копирование. Полный путь находится в свойстве path компонента ShellTreeviewl. Также проверяется, если последний символ пути не равен знаку его нужно добавить:

После цикла в переменную FSrc добавляется еще один нулевой символ. Таким образом, в конце строки будет два символа #о#о, что и будет означать конец строки:

Теперь напишем код для кнопки Переместить. Для этого в обработчике события onclick соответствующей кнопки пишем следующее (листинг 3.18).

for i := 0 to ShellListViewl.items.Count-1 do if (ShellListViewl.items.item[il.Selected) then begin FSrc:=FSrc+

Этот код идентичен тому, что мы написали для кнопки Копировать. Разница только в вызове процедуры DoSHFileOp, где мы указываем операцию FileOpMode [2], что означает перемещение. А в остальном там так же определяется директория, из которой нужно копировать, и так же формируется строка из имен файлов для копирования, разделенных нулевым символом.

Читайте также:  Имена для кошек девочек редкие и красивые и современные шотландской породы

В обработчике нажатия кнопки Удалить пишем следующий код (листинг 3.19).

for i := 0 to FilesListView.items.Count-1 do if then begin DelFName:=DelFName+

И снова код похож на тот, что мы уже использовали дважды. Но есть все-таки две разницы:

1. Мы проверяем, находится ли какой-нибудь файл в режиме редактирования ЕііезіЛз^іе*.І8Ес!Шп§. Если да, ТО ВЬМДМ ИЗ процедуры.

2. В вызове процедуры ОоЗНЕііеОр в качестве второго параметра мы напрямую указываем константу БорЕЬЕТЕ, хотя можно было бы указать РііеОрМоає [ 1], что абсолютно то же самое.

В обработчике нажатия кнопки Свойства напишем следующий код (листинг 3.20).

Здесь мало строчек кода, но с ним придется разбираться. В начале происходит простая проверка на выделение. Если пользователь ничего не выбрал, то выходим, иначе в следующей строке произойдет ошибка. Дальше мы вызываем функцию SHObjectProperties, которая отображает стандартное окно свойств объекта. У этой функции 4 параметра.

О Указатель на окно-владельца.

□ Так как мы используем файлы и папки, то здесь должен быть полный путь к этому объекту.

О Последний параметр оставляем равным nil.

На рис. 3.19 вы можете увидеть стандартное окно свойств, вызванное из нашей программы.

Рис. 3.19. Стандартное окно свойств объекта

Чтобы проект теперь скомпилировался, нужно сообщить о существовании функции зногое^Ргорегг^ез, о которой Ш1рЫ еще не знает. Для этого создайте файл stan.dardDialogs.pas и напишите в нем следующее (листинг 3.21).

windows, Messages, SHlObj,-

//Cancel the operation and close the dialog.

TSHObjectProperties = function(hwndOwner: HWND); uFlags:

Теперь добавьте в раздел uses имя нашего модуля standardDialogs и скомпилируйте проект. Теперь можете запустить проект и посмотреть результат.

На компакт-диске в директории \Примеры\Глава 3\File Operation вы можете увидеть пример данной программы и цветные версии рисунков.

Источник

Работа с файлами в Delphi: классика Pascal. Работа с типизированными файлами в Delphi

Удивительно, но факт – запрос “delphi файлы” в Яндексе – это один из самых популярных запросов, касающихся Delphi. Популярнее только “delphi скачать” – видимо ещё не все слышали про такую штуку как Delphi Community Edition. Раз есть в Сети запрос – должен быть и ответ. Посмотрим, что получится в итоге.

Содержание статьи

Классика работы с файлами в Delphi – ключевое слово File

Этот способ, без преувеличения, можно назвать древнейшим способом работы с файлами в Pascal/Delphi. Однако и он до сих пор используется в работе, особенно, если это, например, лабораторная работа по информатике в школе или ВУЗе.

Для определения файловой переменной в Delphi/Pascal используется ключевое слово File. При этом, мы можем определить как типизированный файл, так и не типизированный, например:

Для типизированного фала мы можем задать тип данных фиксированного размера (ShortString, String[20], Integer, Single и так далее), например, мы можем определить такие типизированные файлы:

Или, как в примере выше использовать для указания типа запись (record), в которой все поля имеют фиксированный размер. Для типизированного файла нельзя указывать типы данных, размер которых не фиксирован, например, вот такие определения файловых переменных недопустимы:

Более того, даже компилятор Delphi укажет вам на ошибку, сообщив следующее:

Определив файловую переменную можно приступать к работе с файлом. Алгоритм работы при этом будет следующим:

При этом, для типизированных и не типизированных файлов работа в части чтения/записи несколько различается в плане используемых методов.

Работа с типизированными файлами в Delphi

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

Пример №1. Запись данных в типизированный файл Delphi

Запишем в наш файл две записи:

Рассмотрим методы, используемые в этом примере:

Связывает файловую переменную F с внешним файлом FileName. В качестве второго параметра может задаваться как абсолютный путь к файлу, например, ‘C:/MyFile.txt‘, так и относительный, например, в коде выше файл будет создан рядом с exe-файлом.

Создает новый файл и открывает его. Если внешний файл с таким именем уже существует, он удаляется и на его месте создается новый пустой файл. Если F уже открыт, он сначала закрывается, а затем воссоздается. Текущая позиция файла устанавливается в начале пустого файла.
F – это переменная, связанная с внешним файлом с использованием AssignFile. RecSize – это необязательное выражение, которое можно указывать, только если F является нетипизированным файлом (об этом ниже).

Читайте также:  В бой идут одни старики имена героев

Используется для записи в типизированный файл. F – файловая переменная, P1..PN – это переменная того же типа, что и тип файла F.

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

В результате выполнения представленного выше кода, рядом с exe-файлом будет создан новый файл MyFile.txt, содержащий две записи, при этом, каждая запись будет иметь фиксированный размер, вне зависимости от фактических имени/фамилии.

Для того, чтобы в delphi не перезаписывать каждый раз файл, а добавлять в конец файла новые записи необходимо открывать типизированные файлы методом Reset. Рассмотрим пример добавления новых записей в типизированные файлы Delphi.

Пример №2. Добавление записей в типизированный файл Delphi

Рассмотрим такой пример Delphi:

Разберемся с тем, что здесь делается. Во-первых, условие:

проверяет, существует ли файл на диске. Метод FileExist имеет следующее описание:

FileName – имя файла, существование которого необходимо проверить. Второй параметр – FollowLink учитывается только при использовании символической ссылки. То есть, если нужно проверить только наличие символической ссылки на файл, то параметр FollowLink устанавливается в False, а если нужно проверить наличие и символической ссылки на файл и самого файла, то FollowLink устанавливается в True (значение по умолчанию).

Таким образом, в нашем примере, если файла нет на диске то он создается пустым. Далее выполняется цикл:

В этом цикле, если пользователь вводит 1, выполняется процедура AppendTypedFile, которая добавляет в файл очередную запись:

Здесь, в принципе, весь алгоритм расписан в комментариях к процедуре.
Метод Reset не воссоздает файл снова, как Rewrite, а открывает его для чтения/записи (в случае двоичных файлов). Что касается метода Seek, то он имеет следующее описание:

F – файловая переменная, ассоциированная с файлом на диске, N – номер записи в файле (первый номер – 0). Чтобы переместиться сразу в конец файла, мы сделали такой вызов:

где FileSize – это метод Delphi имеющий следующее описание:

В случае использования типизированных файлов эта функция возвращает количество записей в файле.

После того, как пользователь вводит что-то кроме 1 срабатывает метод ReadTypedFile – чтение всех записей из файла:

Здесь мы, опять же, открываем файл методом Reset и в цикле while..do проходим по всем записям файла, пока не дойдем до конца. Здесь мы использовали два новых метода Delphi:

Eof возвращает True, если текущая позиция файла находится за последним символом файла или файл пуст. В противном случае Eof возвращает False.
По аналогии с методом Write, метод Read производит чтение очередной записи из файла и имеет следующее описание:

Результат работы нашего примера может быть следующим:

Ещё одним полезным методом для работы с типизированными файлами может быть процедура Truncate:

Удаляет все записи после текущей позиции файла. Вызовите Truncate в коде Delphi, чтобы текущая позиция файла стала концом файла (Eof (F) вернет true).
Рассмотрим пример использования этой процедуры.

Пример №3. Удаление последних записей типизированного файла в Delphi

Воспользуемся файлом, созданным в предыдущем примере и удалим из него две последние записи:

В этом примере мы делаем следующее:

Подведем итог

Для работы с типизированными файлами в Delphi в самом общем случае нам необходимо выполнить следующую последовательность операций:

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

Функции и процедуры для работы с типизированными файлами в Delphi/Pascal

Источник

Оцените статью
Имя, Названия, Аббревиатуры, Сокращения
Добавить комментарий

Adblock
detector